为了理解编译器如何选择类的构造函数,我编写了以下代码:
#include <iostream>
struct Widget
{
Widget(Widget&& w){std::cout << "Move ctor" << std::endl;}
Widget(void){std::cout << "Default ctor" << std::endl;}
Widget(const Widget& w){std::cout << "Copy ctor" << std::endl;}
};
Widget make_widget(void) //helper function
{
Widget w;
return w;
}
int main(void)
{
Widget w(make_widget());
}
根据 Effective Modern C++ 的第 25 项,由于返回值优化,编译器将 w 视为右值引用。所以我期望Widget w(make_widget())
调用移动构造函数。但事实并非如此。此外,它只打印
Default
所以我不知道调用了哪个版本的构造函数。然后我也尝试显式返回右值。即,return std::move(w)
。考虑到上述结果,与我的预期相反,它正确调用了移动构造函数,并打印了
Default
Move
看来我正处于右值的迷宫中。请告诉我那里发生了什么。