【发布时间】:2016-02-09 15:06:01
【问题描述】:
也许有些东西我没有完全理解,但是在阅读“使用 decltype on auto&& parameters to std::forward them”(来自 Effective Modern C++)之后,我发现了一些非常奇怪的东西。
假设我们有
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(一个带有auto,一个正确转发auto&&参数):
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) 调用 size(const std::string&),而 f("fiorellino") 和 g("fiorellino") 调用 size 的重载右值。
我的问题是:为什么会这样?不应该只有第二个 lambda 能够区分左值和右值吗? 我期待第一个 lambda (f()) 调用两次 size(const std::string&),但显然这没有发生。
我是不是做错了什么?
【问题讨论】:
-
您能详细说明一下吗?我直接从 Scott Meyers 的书中举了这个例子。
-
好吧,
f("fiorellino")不会导致构造一个临时的std::string(一个永远不会绑定到左值的)吗?所以我没有看到选择右值重载的问题。 "当用作函数参数并且函数的两个重载可用时,一个采用右值引用参数,另一个采用左值引用到 const 参数,一个右值绑定到右值引用重载"。 -
@nwp :绝对错误。