关于在等号左侧使用右值引用的规则是什么?

时间:2019-07-02 01:12:57

标签: c++ c++11 rvalue-reference lvalue-to-rvalue

所以我一直在学习rvalues和rvalue引用,并在尝试无法解决错误的同时遇到了一些代码。

int&& test1(int& t)
{
    return static_cast<int&&>(t);
}

std::string&& test2(std::string& t)
{
    return static_cast<std::string&&>(t);
}


int main()
{
    int n ;
    std::string s;
    static_cast<int&&>(n) = 9;        //Error: expression must be a modifiable lvalue
    static_cast<std::string&&>(s) = "test";  //Compiles and runs fine
    test1(n) = 4;                     //Error: expression must be a modifiable lvalue
    test2(s) = "hello";               //Compiles and runs fine 
}

我只是想知道std :: strings和int的右值引用的处理方式有什么区别,为什么一个起作用而一个不起作用?

我正在将Visual Studio 2019与C ++ 17一起使用

1 个答案:

答案 0 :(得分:1)

因为C ++以不同的方式对待类类型和内置类型。

对于内置类型,不能设置右值。

对于类类型,例如std::stringtest2(h) = "hello";test2(h).operator=("hello");相同; operator=std::string的成员,与其他成员函数并不特殊。如果允许在右值上调用成员operator=,这是有效的,而对于std::string::operator=,则为true。您甚至可以编写类似std::string{} = "hello";的内容,即分配给一个即将被销毁的临时文件,这确实没有多大意义。

如果要限制只能在左值上调用用户定义类的成员函数,则可以指定lvalue ref-qualifier (since C++11),反之亦然。例如

struct X {
    X& operator=(const char*) & { return *this; }
    //                        ^
};

LIVE