Lau*_*ent 8 c++ rvalue lvalue-to-rvalue c++11
为什么这段代码会编译?我认为ctor返回的rvalues不在内存中,因此不能用作左值.
#include <iostream>
#include <vector>
class Y {
public :
explicit Y(size_t num = 0)
: m_resource {std::vector<int>(num)}
{
}
std::vector<int> m_resource;
};
int main(int argc, const char * argv[]) {
Y(1) = Y(0); // WHAT?!?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据见12.8 [class.copy]第18段,合成赋值运算符被声明为其中之一(如果它可以合成并且未声明为已删除):
Y& Y::operator=(Y const&)Y& Y::operator=(Y&) ()也就是说,对于没有使用ref-qualifiers特别声明的任何其他成员函数,它适用于rvalues.
如果要阻止作业左侧的临时对象,则需要相应地声明它:
class Y {
public :
explicit Y(std::size_t num = 0);
Y& operator= (Y const&) & = default;
};
Run Code Online (Sandbox Code Playgroud)
该标准使用名称ref-qualifier作为&之前的= default.相关提案是N2439.我不知道哪里有很好的ref-qualifiers描述.这个问题有一些信息.
| 归档时间: |
|
| 查看次数: |
778 次 |
| 最近记录: |