use*_*462 19 c++ c++11 emplace c++17
我刚学会了C++ 17中保证的复制省略.根据该问题的答案:
执行
return T();此操作时,将通过a初始化函数的返回值prvalue.由于该函数返回T,因此不会创建临时函数;prvalue简单的初始化直接初始化返回值.要理解的是,由于返回值是a
prvalue,它还不是一个对象.它只是一个对象的初始化器,就像T()是.
所以我想知道,这是否适用于除以下之外的任何事情:
T f() {return T();}
T t = f();
Run Code Online (Sandbox Code Playgroud)
所以我编写了这段代码emplace_back来测试它:
#include <vector>
#include <iostream>
struct BigObj{
BigObj() = default;
BigObj(int) { std::cout << "int ctor called" << std::endl; }
BigObj(const BigObj&){
std::cout << "copy ctor called" << std::endl;
}
BigObj(BigObj&&){
std::cout << "move ctor called" << std::endl;
}
};
BigObj f(){ return BigObj(2); }
int g(){ return 2; }
int main(){
std::vector<BigObj> v;
v.reserve(10);
std::cout << "emplace_back with rvalue \n";
v.emplace_back(1+1);
std::cout << "emplace_back with f()\n";
v.emplace_back(f());
std::cout << "emplace_back with g()\n";
v.emplace_back(g());
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出(禁用了复制省略):
emplace_back with rvalue
int ctor called
emplace_back with f()
int ctor called
move ctor called
emplace_back with g()
int ctor called
Run Code Online (Sandbox Code Playgroud)
似乎移动构造函数仍被调用,即使a prvalue直接传入emplace_back,我认为可以用来直接构造一个对象,而不是用来构造一个临时然后移动它.
是否有更优雅的方法来避免移动构造函数调用而emplace_back不是执行类似g()函数的操作?