gpt4 book ai didi

c++ - 关于重载运算符的 ADL 或命名冲突是否有不同的规则?

转载 作者:太空狗 更新时间:2023-10-29 21:42:56 27 4
gpt4 key购买 nike

我认为这个例子最能说明我的问题:

namespace N {

class C {
public:
friend bool operator==(const C& c, const C& x) {
return true;
}
friend bool f(const C& c, const C& x) {
return true;
}
};

class D {
public:
bool operator==(const D& x) {
bool a = C{} == C{}; // this works
return true;
}
bool f(const D& x) {
bool a = f(C{}, C{}); // this does not work
return true;
}
};
}

我一直认为重载运算符就像函数一样,除了“调用语法”(如果您愿意的话)。但是,我只是在 ADL 或名称查找规则中注意到了上述差异(我不知道是哪一个)。

有人可以解释为什么找到了 bool operator==(const C& c, const C& x)bool f(const C& c, const C& x)不是吗?

最佳答案

你的 D::f 隐藏 C::f;如果您将后者重命名为 C::g 并调整调用,那么它就可以正常工作(表明可以找到访问函数很好)。

您的代码实际上并没有直接调用运算符函数,但这是由语言为您完成的。因此,您没有使用运算符函数的名称,因此不适用名称隐藏。

如果您编写 operator==(C{}, C{})(而不是 C{} == C{}),那么您会看到与 f(C{}, C{}) ( demo ) 相同的行为。

所以,当您说“我一直认为重载运算符就像函数一样,除了‘调用语法’,如果您愿意的话”,您已经一针见血了。


这里有一些标准语:

[C++11: 13.5/4]: Operator functions are usually not called directly; instead they are invoked to evaluate the operators they implement (13.5.1 – 13.5.7). They can be explicitly called, however, using the operator-function-id as the name of the function in the function call syntax (5.2.2). [ Example:

complex z = a.operator+(b); // complex z = a+b;
void* p = operator new(sizeof(int)*n);

—end example ]

[C++11: 3.3.7/4]: [..] 4) A name declared within a member function hides a declaration of the same name whose scope extends to or past the end of the member function’s class. [..]

[C++11: 3/4]: A name is a use of an identifier (2.11), operator-function-id (13.5), literal-operator-id (13.5.8), conversion-function-id (12.3.2), or template-id (14.2) that denotes an entity or label (6.6.4, 6.1).

(这里的[限定] operator-function-id::N::C::operator==。)

关于c++ - 关于重载运算符的 ADL 或命名冲突是否有不同的规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24168137/

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