【发布时间】:2016-06-14 22:05:42
【问题描述】:
为了了解编译器如何选择类的构造函数,我编写了以下代码:
#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
看来我正处于右值的迷宫中。请告诉我那里发生了什么。
【问题讨论】:
-
你忘记的一个重要部分,它与RVO 密切相关,是copy elision,它将解释你的行为。
-
您似乎对什么是 RVO 感到困惑。 RVO 删除对移动构造函数的不必要调用。
-
如果您不将所有内容都称为
w...,您的文字会更容易阅读 -
我好像误解了 RVO 的工作。我现在逐渐了解 RVO 和优化。
标签: c++ c++11 move-semantics rvalue-reference rvo