170 похожих чатов

Какой тип должна принимать шаблонная функция, если я хочу, чтобы

она принимала const std::string& и std::string&&?
P.S. У Мейерса этот момент не совсем понял

31 ответов

7 просмотров

universal reference. с двумя амперсандами

Eyed-Shovel Автор вопроса
Stas
universal reference. с двумя амперсандами

Понял. Тогда немного не понял про обычный lvalue reference в шаблонах для rvalue. Вот что он пишет: "Все эти примеры показывают ссылочные параметры, являющиеся lvalue, но вывод типа точно так же работает и для ссылочных параметров rvalue. Конечно, rvalue-аргументы могут передаваться только ссылочным параметрам, являющимся rvalue, но это ограничение никак не влияет на вывод типов" В общем, вот его пример template<typename T> void f(T& param); int x = 27; int& rx = x; f(rx); // тип T - int, тип param - int& Что будет в случае с f(std::move(x))?

С большой вероятностью нужен просто std::string by value

Eyed Shovel
Так копирование будет

Поясню: если принимающему методу нужна строка для владения (ну, а какой ещё смысл может быть от std::string&& перегрузки?), то пара const std::string& + std::string&& ничем* не лучше одной функции с std::string

Eyed-Shovel Автор вопроса
Alexander Karaev
Поясню: если принимающему методу нужна строка для ...

Почему? Если вызов будет func("Бла-бла"), то будет копирование же, нет? А если func(s), то будет копирование

Eyed Shovel
Почему? Если вызов будет func("Бла-бла"), то будет...

func("Бла-бла") - копирования не будет, будет мув.

Eyed Shovel
Почему? Если вызов будет func("Бла-бла"), то будет...

Ну а для func(s) будет в одном случае копирование или внутри функции (если принимать const std::string& и копировать внутри), или снаружи (если принимать по значению). Итого - копий одинаковое кол-во.

Eyed Shovel
Понял. Тогда немного не понял про обычный lvalue ...

тут просто надо помнить правила слияния ссылок. у тебя T = int&&, следовательно T& = int&& & = int&. Значит ты передашь параметр по обычной ссылке

Eyed-Shovel Автор вопроса
Eyed Shovel
Заставляет сильно задуматься

Да если подумаешь, то всё оказывается просто и понятно

Stas
тут просто надо помнить правила слияния ссылок. у ...

Ну можно и без правил свертки ссылок нормально жить я думаю

Слава
Ну можно и без правил свертки ссылок нормально жит...

что бы понять как работает perfect forwarding и почему foo(T&) принимает только rvalue ссылки, правила нужно знать

Stas
что бы понять как работает perfect forwarding и по...

Ну мне нормально и объяснения Мейерса с универсальной ссылкой

Слава
Ну мне нормально и объяснения Мейерса с универсаль...

речь же про эту статью? https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers

Слава
Да

Because there are two kinds of references (lvalue references and rvalue references), there are four possible reference-reference combinations: lvalue reference to lvalue reference, lvalue reference to rvalue reference, rvalue reference to lvalue reference, and rvalue reference to rvalue reference. There are only two reference-collapsing rules: An rvalue reference to an rvalue reference becomes (“collapses into”) an rvalue reference. All other references to references (i.e., all combinations involving an lvalue reference) collapse into an lvalue reference.

Eyed-Shovel Автор вопроса
Слава
int

Поправил, извините

Слава
Хз что это меняет

Ничего не меняет. Просто Скотт Мейрес рассказывает про правила свёртки в статье про perfect forwarding

Eyed Shovel
int && a = 5; auto& x = a; // int&?

Да. Тут теже правила используются int & lvalue = ...; int && rvalue = ...; auto& x1 = lvalue; // int& auto&& x1 = lvalue; // int& auto& x2 = rvalue; // int& auto&& x2 = std::move(rvalue); //int&&

Eyed-Shovel Автор вопроса
Stas
Да. Тут теже правила используются int & lvalue = ....

О, теперь понял. int a = 5; auto&& b = std::move(a); // int&&?

Eyed-Shovel Автор вопроса

Похожие вопросы

Обсуждают сегодня

Такс, блин, таки кто-то знает, каким образом работают макросы stdin/stdout/stderr? Я влез в stdio.h, там определения нет, отладил через асмокод - вызывается функция со странны...
The Bird of Hermes
18
Всем привет, на линуксе лучше на fasm или nasm учиться писать для начала ?
meszjol
14
Если у меня есть такой класс: Object = {} function Object:new(a_name, a_transform, a_color, a_mesh, a_material, a_shader, a_textures) local private = {} private.n...
Cuarno Vile
4
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
было так ;void set_http_ver(RESPD* ptr, char* version, uint32_t length) // example: 'RTSP/1.1 ' set_http_ver: mov eax, [esp + 4] mov ecx, [esp + 8] ...
Mixail Frolov
5
Гайз, кто-нибудь пробовал запустить probe-rs под камень, которого нет в probe-rs? Мб есть какой-нибудь пример у кого... Через target-gen попробовал сгенерировать chip-descript...
Максим Смирнов
2
зачем же переименовывать ? чтобы кол-во участников возросло или вдруг IBM от этого снова на свифте начнет кодить ? Я не понимаю что страшного в том что свифт гавно, если это т...
Oleh Nerzh
10
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
здравствуйте. совершаю вот такую вещь: strcpy(line, (char)current_number); где current number — неподписанный шорт, line — массив чаров. ругань следующая: main.c:29:30: error...
Roberto's Ширгозиев
13
Карта сайта