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

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

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

31 ответов

26 просмотров

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 Автор вопроса

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта