在等号左侧使用右值引用的规则是什么?
What are the rules about using an rvalue reference on the left side of an equals sign?
所以我一直在学习右值和右值引用,并在试验时将 运行 放入一些代码中,但我无法解决错误。
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
因为 C++ 以不同的方式处理 class 类型和 build-in 类型。
对于 build-in 类型,无法分配右值。
对于 class 类型,例如std::string
、test2(h) = "hello";
等同于test2(h).operator=("hello");
; operator=
是std::string
的成员,和其他成员函数没有什么特别之处。如果允许在右值上调用成员 operator=
,这是有效的,对于 std::string::operator=
也是如此。你甚至可以写类似 std::string{} = "hello";
的东西,即分配给一个很快就会被销毁的临时文件,这确实没有多大意义。
如果要限制user-defined的成员函数class只能在左值上调用,可以指定lvalue ref-qualifier (since C++11),反之亦然。例如
struct X {
X& operator=(const char*) & { return *this; }
// ^
};
所以我一直在学习右值和右值引用,并在试验时将 运行 放入一些代码中,但我无法解决错误。
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
因为 C++ 以不同的方式处理 class 类型和 build-in 类型。
对于 build-in 类型,无法分配右值。
对于 class 类型,例如std::string
、test2(h) = "hello";
等同于test2(h).operator=("hello");
; operator=
是std::string
的成员,和其他成员函数没有什么特别之处。如果允许在右值上调用成员 operator=
,这是有效的,对于 std::string::operator=
也是如此。你甚至可以写类似 std::string{} = "hello";
的东西,即分配给一个很快就会被销毁的临时文件,这确实没有多大意义。
如果要限制user-defined的成员函数class只能在左值上调用,可以指定lvalue ref-qualifier (since C++11),反之亦然。例如
struct X {
X& operator=(const char*) & { return *this; }
// ^
};