c++ - 返回的对象如何分配?

标签 c++ constants rvalue

在 Effective C++ 的第 3 项中,Scott Meyers 建议为名为 Rational 的类重载 operator*:

    class Rational { ... };
    const Rational operator*(const Rational& lhs, const Rational& rhs);

返回值是 const 限定的原因在以下行中解释:如果它不是 const,程序员可以编写如下代码:

    (a * b) = c;

或者,更可能的是:

     if (a*b = c)

很公平。 现在我很困惑,因为我认为函数的返回值,这里是 operator*,是一个右值,因此不可赋值。我认为它不可分配,因为如果我有:

    int foo();
    foo() += 3;

如果赋值中的左值无效,那将无法编译。 为什么这里没有发生这种情况?有人可以阐明这一点吗?

编辑:我在 Scott Meyers 的那个 Item 上看到了许多其他线程,但没有一个解决了我在这里暴露的右值问题。

最佳答案

重点是对于类类型,a = b只是a.operator=(b)的简写,其中operator= 是一个成员函数。并且可以在右值上调用成员函数。

请注意,在 C++11 中,您可以通过使 operator= 为左值来禁止它:

class Rational
{
public:
  Rational& operator=(Rational const& other) &;
  // ...
};

& 告诉编译器不能对右值调用此函数。

关于c++ - 返回的对象如何分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39728354/

相关文章:

c++ - 使用 const 来防止数据类型更改和值更改

c++ - 为什么用括号包裹的标记不是 r 值表达式?

c++ - 为什么允许 T() = T()?

C++ 将字符串转换为 char 不起作用

c++ - 用空格拆分字符串会导致字符串损坏

c++ - Selenium 和 qt C++?

c++ - 使用文件输入中的值初始化类中的 const 成员变量

c++ - 模板模板参数有哪些用途?

c++ - 带引用键的 unordered_map

c++ - 为左值 move 语义