左侧的右值

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)

Die*_*ühl 8

根据见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描述.这个问题有一些信息.