return 临时值的右值
return rvalue of temporary as value
所以,我有以下 class:
class Foo {
public:
Bar &&bar() {
return std::move(_bar);
}
private:
Bar _bar;
}
我知道在以下上下文中使用此 class 是有效的:
Bar bar;
{
Foo foo;
bar = foo.bar(); // bar is move-assigned, as foo is still in scope
}
现在,我想知道的情况是:如果我直接 return 禁止方法而不事先存储会发生什么:
Bar testFunc() {
Foo foo;
return foo.bar();
}
Bar test = testFunc();
// is test now valid?
我认为这在理论上应该没问题,因为 testFunc
return 是在 foo
被销毁之前从右值构造的值 - 但如果编译器应用 return-value-optimization?
我想我有点困惑这究竟是如何工作的...
is test now valid?
只要移出的对象未被访问,代码就应该有效。
but is this still the case if the compiler applies
return-value-optimization?
Bar testFunc() {
Foo foo; // Bar is constructed here
return foo.bar(); // prvalue is move-constructed and copy elided
}
Bar test = testFunc(); // default ctor + move ctor (one copy elision)
总共进行了一次拷贝省略。
搬出一个成员似乎有点代码味。不了解具体用法很难判断,但可能是:
Bar make_bar(const Foo& foo) {
Bar bar;
// init bar as needed
return bar;
}
这样两个调用都会导致 RVO。
所以,我有以下 class:
class Foo {
public:
Bar &&bar() {
return std::move(_bar);
}
private:
Bar _bar;
}
我知道在以下上下文中使用此 class 是有效的:
Bar bar;
{
Foo foo;
bar = foo.bar(); // bar is move-assigned, as foo is still in scope
}
现在,我想知道的情况是:如果我直接 return 禁止方法而不事先存储会发生什么:
Bar testFunc() {
Foo foo;
return foo.bar();
}
Bar test = testFunc();
// is test now valid?
我认为这在理论上应该没问题,因为 testFunc
return 是在 foo
被销毁之前从右值构造的值 - 但如果编译器应用 return-value-optimization?
我想我有点困惑这究竟是如何工作的...
is test now valid?
只要移出的对象未被访问,代码就应该有效。
but is this still the case if the compiler applies return-value-optimization?
Bar testFunc() {
Foo foo; // Bar is constructed here
return foo.bar(); // prvalue is move-constructed and copy elided
}
Bar test = testFunc(); // default ctor + move ctor (one copy elision)
总共进行了一次拷贝省略。
搬出一个成员似乎有点代码味。不了解具体用法很难判断,但可能是:
Bar make_bar(const Foo& foo) {
Bar bar;
// init bar as needed
return bar;
}
这样两个调用都会导致 RVO。