为什么这段代码可以编译?我认为构造函数返回的右值不位于内存中,因此不能用作左值。
class Y {
public :
explicit Y(size_t num = 0) {}
};
int main() {
Y(1) = Y(0); // WHAT?!?
return 0;
}
根据参见 12.8 [class.copy] 第 18 段,将合成赋值运算符声明为其中之一(如果它可以合成并且未声明为删除):
Y& Y::operator=(Y const&)
-
Y& Y::operator=(Y&)
()
也就是说,就像任何其他没有专门声明的成员函数一样引用限定符 https://stackoverflow.com/questions/8610571/what-is-rvalue-reference-for-this它适用于右值。
如果您想防止在赋值的左侧出现临时对象,您需要相应地声明它:
class Y {
public :
explicit Y(std::size_t num = 0);
Y& operator= (Y const&) & = default;
};
标准使用名称引用限定符为了&
之前= default
。相关提案是N2439 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm。不知道哪里有好的描述引用限定符。有一些信息位于这个问题 https://stackoverflow.com/q/8610571/1120273.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)