Возможно, что-то я получил не полностью, но после прочтения «Использовать decltype для авто & & параметров для std :: forward them» (из Effective Modern C++) Я нашел что-то очень странно.Generic lambdas in C++ 14: странное поведение
Давайте предположим, что мы имеем
int size(std::string &&s) { std::cout <<"std::string&&" <<std::endl; return s.size(); }
int size(const std::string &s) { std::cout <<"std::string const &" <<std::endl; return s.size(); }
Я определил два lambas (один с автомобилем, и тот, который правильно вперед авто & & Param):
auto f = [](auto x) { return size(x); };
std::string s{ "buonanotte" };
std::cout <<f(s) <<std::endl;
std::cout <<f("fiorellino") <<std::endl;
auto g = [](auto&& x) { return size(std::forward<decltype(x)>(x)); };
std::cout <<g(s) <<std::endl;
std::cout <<g("fiorellino") <<std::endl;
Ну, результат тот же : f (s) и g (s) определяют размер (const std :: string &), тогда как f ("fiorellino") и g ("fiorellino") вызывают перегрузку размера для rvalues.
Мой вопрос: почему это происходит? Должна ли не только вторая лямбда различать lvalue и rvalue? Я ожидал, что первая лямбда (f()) вызывает двойной размер (const std :: string &), но, видимо, этого не происходит.
Я что-то не так?
Не могли бы вы немного рассказать об этом? Я взял этот пример непосредственно из книги Скотта Мейерса. – Stadium
Ну, а не 'f (" fiorellino ")' приводит к созданию временной строки 'std :: string' (которая никогда не привязана к lvalue)? Поэтому я не вижу проблемы с выбранной перегрузкой rvalue. _ «Когда используются в качестве аргумента функции, и когда две перегрузок функций доступны, один захват Rvalue ссылочного параметра, а другая принимают именующая ссылка на сопзЬ параметра, Rvalue связываются с эталонной Rvalue перегрузки» _. – Michael
@ nwp: Абсолютно неправильно. – ildjarn