【发布时间】:2018-09-06 10:38:33
【问题描述】:
Move 类的构造函数接受可以引用临时对象的右值引用。所以,我有临时对象和适当的移动构造函数,它们可以接受对临时对象的引用,但移动构造函数没有被调用。 怎么了?
//g++ 5.4.0
#include <iostream>
class foo
{
int data;
public:
foo(int v) : data(v) {std::cout << "foo(int)\n";}
foo(foo&& f)
{
std::cout << "moved\n";
}
void print()
{
std::cout << data;
}
};
void acceptTmp(foo f)
{
f.print();
}
int main()
{
foo f1 = foo(100);
f1.print();
acceptTmp(foo(200)); //also does not move
}
【问题讨论】:
-
@songyuanyao 我知道 c++11 没有保证复制省略,但这种行为发生在 c++11
-
在 C++17 之前不保证,但允许。事实上,大多数体面的编译器都会应用优化。
-
@AlexF 不,移动分配也没有调用
-
这是复制初始化 "如果 T 是一个类类型,并且 other 的类型的 cv 非限定版本是 T 或从 T 派生的类,则检查 T 的非显式构造函数,并通过重载决议选择最佳匹配。然后调用构造函数来初始化对象。” 请参阅:en.cppreference.com/w/cpp/language/copy_initialization
标签: c++ c++11 move-semantics copy-elision