【发布时间】:2014-04-05 22:33:11
【问题描述】:
我无法理解为什么以下内容(至少根据 gcc 4.8)在 C++11 中是合法的:
// This class manages a non-copyable resource.
struct B {
B();
B(B &&) { /* logging, etc., to verify if needed. */ }
private:
B(B const &);
B const &operator=(B const &);
};
B bar() {
B b;
// This is apparently allowed via the move constructor.
return b;
};
int main() {
// From this "side" of the call as well.
B b1 = bar();
B b2{bar()};
}
在哪些情况下语言允许或实际首选移动构造函数?临时返回值似乎可以移动(和垃圾内容),但我想为所有可以静默使用移动的地方找到核心语言规则。谢谢!
【问题讨论】:
-
首先,有一个不错的新
delete关键字:en.wikipedia.org/wiki/… -
“但我想为所有可以静默使用移动的地方找到的核心语言规则”没有一个 规则,但有几个。 “最晦涩的”是返回一个局部变量/一个参数,有一定的限制。除此之外,右值会被移动(您需要查看 C++11 中的右值是什么)。
-
@dyp 您是否碰巧至少有方便的规范通用部分?只要不是盲目搜索,我愿意大量阅读。
-
@Jeff 我认为第 3 节和第 12 节将介绍
rvalues如何绑定。我想你可能对prvalues最感兴趣。 -
@Jeff 正如杰森所说;我将其进一步缩小到 3.10 [basic.lval] 描述 什么是右值,8.5.3./5 [dcl.init.ref] 哪些初始化表达式可以绑定到rvalue、12.8 [class.copy] 何时是隐式生成的移动构造函数 和 12.8/32 返回语句的特殊规则,最后是 13.3.3.2/ 3 [over.ics.rank] rvalue refs 和 const lvalue refs 之间的重载分辨率。这应该涵盖大多数 情况,但可能难以理解。也许阅读一些关于该主题的文章或书籍可能是一个更好的主意。
标签: c++ c++11 object-lifetime move-constructor