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

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

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

31 ответов

24 просмотра

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта