相关疑难解决方法(0)

它是否提高了将赋值运算符标记为仅限左值的安全性?

如果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之前,拼写错误会被忽视.

c++ operator-overloading assignment-operator c++11

11
推荐指数
1
解决办法
300
查看次数

将从函数返回的Rvalue分配给另一个Rvalue

class Test {

public:

    int n1;

};

Test func() {

    return Test();

}

int main() {

    func() = Test();

}
Run Code Online (Sandbox Code Playgroud)

这对我来说没有意义.如何以及为什么允许这样做?是不确定的行为?如果函数返回一个rvalue,那么如何将rvalue设置为另一个rvalue呢?如果我尝试使用任何原始类型,它会给我一个像我期望的错误.

我知道左值是内存中的一个位置,创建临时左值(rvalue?)并将其赋值给另一个左值的函数也是如此?有人可以解释这种语法的工作原理吗

c++ rvalue lvalue-to-rvalue c++11

7
推荐指数
1
解决办法
426
查看次数

分配给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+.

c++ reference rvalue lvalue

5
推荐指数
1
解决办法
656
查看次数