为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
Why passing value-returning function works fine on operator function to overload = operator and not on others?
看看这个代码:
class test
{
int x;
public:
test ()
{
x = 3;
}
};
test returnObj (test &obj)
{
return obj;
}
int main ()
{
test object;
returnObj (returnObj (object)); // line A
return 0;
}
这段代码将在A行给出错误,因为我们将按值返回函数作为实际参数传递,它只接受引用。到目前为止还不错。这很有道理。
假设我们为类测试重载了=和+运算符。现在看看这个:
test a, b;
test d = a + b;
该代码将创建两个类型测试的对象,将它们添加并将结果分配给对象d。但是重载+运算符的运算符函数的原型是:
test operator+ (const test&) const;
这意味着a+b将按值返回结果对象,然后将其传递给重载=运算符的运算符函数,其原型为:
test& operator= (const test&);
这清楚地表明它只接受参考。那么,为什么编译器在这里不给出错误呢。(顺便说一句,请说明通过值返回对象的实际含义(
区别在于单词const
。C++中的规则是,不能将非常数引用绑定到临时引用。
这就是为什么第一个例子不起作用。函数的返回值是一种临时的,returnObj
函数参数是一个非常数引用。如果您将test returnObj (test &obj)
更改为test returnObj (const test &obj)
,它将编译。
但在第二个例子中,operator=
采用了const引用,这就产生了所有的差异。
按值重新计算对象只意味着返回类型不是引用的函数。
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 在 C++ 中调用类中的运算符函数
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- 为什么 ADL 的运算符函数行为与其他函数不同?
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- 第二个常量在运算符函数中做什么?
- 重载赋值运算符函数和复制构造函数中的错误
- 内置类型的运算符函数
- 如何调用运算符函数添加两个对象?
- Const 仍然允许在运算符函数 c++ 下进行更改
- 在呼叫运算符函数const中调用运算符时错误
- 是否有一种方法可以在超载运算符函数中接触默认运算符函数
- 重载时获取堆栈溢出 >> 运算符函数是为类调用的。我需要进行哪些更改?
- 运算符 [] 函数的实现是如何工作的
- C++:使用父类运算符函数更新子类对象的继承变量
- 创建一个接受 2 个输入参数的文本运算符函数
- 为什么找不到重载运算符函数?
- 为什么auto_ptr中有模板复制构造函数和覆盖运算符函数
- 为什么某些C++标准库“运算符<<”函数将其流宽度重置为 0
- C++SFINAE运算符/函数结果类型检查