Kri*_*Kri 4 c++ move-semantics copy-elision c++11
类的移动构造函数接受可以引用临时对象的rvalue引用.所以,我有临时对象和适当的移动构造函数,它可以接受对临时对象的引用,但是移动构造函数不会被调用.怎么了?
//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
}
Run Code Online (Sandbox Code Playgroud)
怎么了?
没有什么是错的,除了你期望调用移动构造函数.
在C++ 17之前,从抽象机器的角度来看,临时对象确实会被移入参数.但是,该标准允许编译器通过直接构造临时代替移动到的对象来省略移动.您不能依赖移动构造函数的副作用.
在C++ 17之后,没有涉及临时对象或移动.该标准保证了参数的构建.
缺乏行动是一件好事.移动对象可能比不移动对象慢.
| 归档时间: |
|
| 查看次数: |
602 次 |
| 最近记录: |