我想填充std :: vector(或其他一些STL容器):
class Foo {
public:
Foo(int _n, const Bar &_m);
private:
std::vector<Foo> fooes_;
}
Run Code Online (Sandbox Code Playgroud)
1.好看的ctor,性能昂贵
std::vector<Foo> get_vector(int _n, const Bar &_m) {
std::vector<Foo> ret;
... // filling ret depending from arguments
return ret;
}
Foo::Foo(int _n, const Bar &_m) : fooes_(get_vector(_n, _m) {}
Run Code Online (Sandbox Code Playgroud)
2.性能更好,看起来更糟糕
void fill_vector(int _n, const Bar &_m, std::vector<Foo> &_ret) {
... // filling ret depending from arguments
}
Foo::Foo(int _n, const Bar &_m) { fill_vector(_n, _m, fooes_); }
Run Code Online (Sandbox Code Playgroud)
是否可以get_vector使用C++ 0x(移动语义功能等)重写第一个示例中的函数以避免冗余复制和构造函数调用?
我很好奇这个功能是如何工作的.考虑类似的事情
std::unique_ptr<int> f() { std::unique_ptr<int> lval(nullptr); return lval; }
Run Code Online (Sandbox Code Playgroud)
即使对于仅移动类型,此代码编译也很好,因为编译器会隐式移动它.但从逻辑上讲,对于任何返回表达式,确定结果是否引用局部变量都将解决暂停问题 - 如果编译器只是将所有局部变量视为返回表达式中的rvalues,那么这将成为变量的问题可以多次在该一个表达式中引用.即使本地只有一个直接引用,您也无法证明它没有其他间接别名.
那么编译器如何知道何时从返回表达式移动?