返回的对象如何可赋值
How can a returned object be assignable?
在有效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)
很公平。现在我很困惑,因为我认为函数的返回值,这里的运算符*,是一个右值,因此不可赋值。我认为它是不可分配的,因为如果我有:
int foo();
foo() += 3;
将无法使用CCD_ 5进行编译。为什么这里不发生这种事?有人能解释一下吗?
编辑:我在Scott Meyers的那个项目上看到了很多其他线程,但没有一个解决我在这里暴露的右值问题。
重点是,对于类类型,a = b
只是a.operator=(b)
的简写,其中operator=
是一个成员函数。成员函数可以在右值上调用。
请注意,在C++11中,您可以通过仅使operator=
左值来抑制它:
class Rational
{
public:
Rational& operator=(Rational const& other) &;
// ...
};
&
告诉编译器,此函数不能在右值上调用。
相关文章:
- 使用重载 [] 运算符返回 std::map() 的可赋值
- std::constexpr 上下文中的可选赋值运算符
- 可视化的c++变量赋值使代码正常工作
- const变量是否可以在具有默认值的参数中赋值(作为可选参数)
- 具有抑制移动构造/赋值的类型如何仍被视为可移动类型?
- C++复制可克隆层次结构中的构造函数和赋值
- 循环赋值的多维数组:表达式必须是可修改的左值
- 带有模板类的赋值运算符 - 没有可接受的转换,C++
- 为什么具有const成员的结构是可赋值的
- 在不使用元素复制赋值运算符的情况下复制向量 - 可移植性
- 比较 (<)、输出 (<<) 和赋值 (=) 用于提升::可选
- 返回的对象如何可赋值
- boost可选赋值和std::experimental可选赋值的区别
- 在可强制转换为另一个模板类型的类模板中重载赋值操作符
- 错误:表达式不是可赋值的c++结构
- 为什么我必须将地址强制转换为整数以使其可赋值?
- Boost::asio::socket如何从它获得int或int,这将是跨平台可赋值的
- 如何为未在协议中赋值的可选字段分配空间
- Std::string not nothrow move可赋值或可比较
- 如何测试普通复制可赋值的lambdas