gpt4 book ai didi

C++ 候选函数不可行?

转载 作者:行者123 更新时间:2023-12-01 14:22:38 25 4
gpt4 key购买 nike

为什么以下代码无法编译:

B b1(1), b2(2), b3(3);
const B b4 = b1 + (b2 + b3);

直到我替换这个:
B operator+(B& b) {
return B(n + b.n);
}

有了这个:(我不知道为什么要写编译器建议的 const)
B operator+(const B& b) {
return B(n + b.n);
}

我得到的错误:

invalid operands to binary expression ('B' and 'B')

note: candidate function not viable: expects an l-value for 1st argument

note: candidate template ignored: could not match 'reverse_iterator' against 'B' operator+(typename reverse_iterator<_Iter>::difference_type __n, const reverse_iterator<_Iter>& __x)



另外,为什么这有效? (与上一个案例类似)
bool Test(int x)
{
return x==0;
}
Test(0);

最佳答案

const B b4 = b1 + (b2 + b3);


根据运算顺序,第一个求值的子表达式是 b2 + b3 .这会调用 B::operator+ ,返回 B目的。更准确地说,临时 B返回对象,该对象将用于帮助评估此完整表达式,然后将其丢弃。这很像在草稿纸上做笔记,因为您需要手动进行长时间的计算。

下一个要计算的子表达式是 b1加上临时对象。这会调用 b1.operator+与临时 B对象作为论据。当运算符(operator)的签名是
B operator+(B& b)

有一个问题,因为 C++ 语言声明 a non- const reference cannot bind to a temporary object .也就是说,引用参数 ( B& b) 与临时对象不匹配。您可以通过更改不是 const 的引用来解决此问题。 - 符合条件。
B operator+(const B& b)

此版本的运算符采用 const引用,它可以绑定(bind)到一个临时对象。 (同样,这只是语言的规则。你可以争论它的原因,但规则仍然有效。)

请注意,这不是一个完整的解决方案,因为加法往往是对称的。为了适应括号左侧为 const 的情况-合格, *this还需要是 const -合格的。
B operator+(const B& b) const

有关更多提示,请参阅 the basic rules and idioms for operator overloading .你可能会发现你不一定想要 operator+成为成员函数。

关于C++ 候选函数不可行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62353625/

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