gpt4 book ai didi

c++ - 为什么友元运算符要求其操作数具有常量性,而成员运算符则不需要?

转载 作者:行者123 更新时间:2023-12-02 10:40:40 26 4
gpt4 key购买 nike

这可能与 taking references to temporary objects仅在某些情况下允许,但我不确定此规则如何应用。
在本例中,编译器在 a + b + c 行停止。因为a + b返回 Int ,必须引用它才能评估 (a+b) + c .根据我所读到的,这是一个深思熟虑的选择,因此临时值不会发生突变。修复此代码的方法是将签名更改为 Int operator + (const Int & a, const int & b) .

struct Int {
int a;
Int() { a = 0; }
Int(int i) { a = i; }
friend Int operator + (Int &, const Int &);
};

Int operator + (Int & a, const Int & b) {
return Int(a.a + b.a);
}

int main() {
Int a, b, c;
a + b + c;
return 0;
}
但是,如果我们将运算符从 friend函数成为一个结构成员,然后这个代码,它应该与创建一个临时可变值有同样的问题,实际上编译:
struct Int {
int a;
Int() { a = 0; }
Int(int i) { a = i; }
Int operator + (Int &);
};

Int Int::operator + (Int & v)
{
return Int(a + v.a);
}

int main()
{
Int a, b, c;
a + b + c;
return 0;
}
为什么会发生这种情况?这两种情况看起来大多相同,但在后者中,不仅是 const RHS 值不需要 -ness,LHS 值也不需要。

最佳答案

在第一种情况下,代码实际上等效于:

operator+(operator+(a, b), c);
在这里,表达式 operator+(a, b)是一个右值,不能绑定(bind)到非常量左值引用。
在第二种情况下,我们有:
a.operator+(b).operator+(c);
没有这样的问题,因为只有左值 bc绑定(bind)到该非常量左值引用参数。

正如@BenVoigt 指出的那样,您可能想知道在临时上调用非常量成员函数。这是完全合法的。标准中有一条关于它的特殊规则,在@dfrib的答案中有详细描述。

关于c++ - 为什么友元运算符要求其操作数具有常量性,而成员运算符则不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64447376/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com