如果T是具有赋值运算符的默认签名的类类型,那么我们可以编写:
T const &ref = ( T{} = something );
Run Code Online (Sandbox Code Playgroud)
这创造了一个悬垂的参考.但是,签名:
T &operator=(T t) &
Run Code Online (Sandbox Code Playgroud)
带有悬空引用的上述代码将无法编译.这可以防止我们返回指定临时对象的左值的一些情况 - 不良情况,因为它们可能导致悬空引用.
有没有理由不这样做; 我们是否会禁用赋值运算符的任何有效用例?
我认为相同的注释也可以应用于复合赋值运算符+=等.更现实的情况可能是:
std::string const &s = std::string("Hello, ") += "world!";
Run Code Online (Sandbox Code Playgroud)
在运行时UB之前,拼写错误会被忽视.
class Test {
public:
int n1;
};
Test func() {
return Test();
}
int main() {
func() = Test();
}
Run Code Online (Sandbox Code Playgroud)
这对我来说没有意义.如何以及为什么允许这样做?是不确定的行为?如果函数返回一个rvalue,那么如何将rvalue设置为另一个rvalue呢?如果我尝试使用任何原始类型,它会给我一个像我期望的错误.
我知道左值是内存中的一个位置,创建临时左值(rvalue?)并将其赋值给另一个左值的函数也是如此?有人可以解释这种语法的工作原理吗
在以下示例中:
class A {
private: double content;
public:
A():content(0) {}
A operator+(const A& other) {
content += other.content;
return *this;
}
void operator=(const A& other) {
content = other.content;
}
};
Run Code Online (Sandbox Code Playgroud)
A是一个double的简单包装器,+并且=运算符已经过载.在以下用途中:
int main(int argc, char *argv[]) {
A a, b, c;
(a+b) = c ; // Why is this operation legal?
}
Run Code Online (Sandbox Code Playgroud)
为什么(a+b) = c编译?我想知道为什么这个陈述是合法的,因为结果(a+b)必须是一个rvalue.我没有从中返回参考operator+.