所以,我有以下课程:
class Foo {
public:
Bar &&bar() {
return std::move(_bar);
}
private:
Bar _bar;
}
我知道在以下上下文中使用此类是有效的:
Bar bar;
{
Foo foo;
bar = foo.bar(); // bar is move-assigned, as foo is still in scope
}
现在,我想知道的情况是:如果我直接从方法返回bar而不事先存储它会发生什么:
Bar testFunc() {
Foo foo;
return foo.bar();
}
Bar test = testFunc();
// is test now valid?
我认为这在理论上应该没问题,因为testFunc
返回一个在foo
被销毁之前从rvalue构造的值 - 但如果编译器应用返回值仍然是这种情况 - 优化
我想我有点困惑这究竟是如何运作的......
答案 0 :(得分:1)
现在测试有效吗?
只要未访问移动的对象,代码就应该有效。
但如果编译器适用,情况仍然如此 返回值优化?
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。