gpt4 book ai didi

c++ - 在 C++11 中查找运算符的规则

转载 作者:IT老高 更新时间:2023-10-28 22:30:33 27 4
gpt4 key购买 nike

N3337 ,“工作草案,编程语言 C++ 标准”,在第 13.3.1.2 节中给出了以下示例,p。 10:

struct A { };
void operator + (A, A);
struct B {
void operator + (B);
void f ();
};
A a;
void B::f() {
operator+ (a,a); // error: global operator hidden by member
a + a; // OK: calls global operator+
}

不过,这只是一个说明:

Note: The lookup rules for operators in expressions are different than the lookup rules for operator function names in a function call, as shown in the following example:

我的问题是,标准中的哪个地方说这是必须发生的事情,而不是仅仅用一个例子来说明?

据我所知,根据第 13.3.1.2 条,p。 2、运算符表达式转换为运算符函数调用。那么为什么和上面的例子应该有区别呢?

编辑:

调查问题后,我想我可能忽略了p。 3 和 p.6 在同一条款中共同声明,在查找运算符时,全局候选者和成员候选者被同等考虑(因此,如注释所述,查找规则不同)。然而,我对这个主题的调查是由这个例子引起的,它以与 GCC 4.8 和 Clang 相同的方式编译:

struct X {};  struct Y {};

void operator+(X, X) { }
void operator+(X, Y) { }

void test() {
void operator+(X, X);
X x; Y y;

x + x; // OK
x + y; // OK

operator+(x, y); // error
operator+(x, x); // OK
}

为什么直接调用操作符函数时, block 作用域声明有阴影,而通过操作符表达式调用时没有?

以下是来自 GCC 的错误:

operators-main-ss.cpp: In function ‘void test()’:
operators-main-ss.cpp:13:17: error: could not convert ‘y’ from ‘Y’ to ‘X’
operator+(x, y); // error
^

这里来自 Clang:

operators-main-ss.cpp:13:16: error: no viable conversion from 'Y' to 'X'
operator+(x, y); // error
^
operators-main-ss.cpp:1:8: note: candidate constructor (the implicit copy constructor) not viable: no
known conversion from 'Y' to 'const X &' for 1st argument;
struct X {}; struct Y {};
^
operators-main-ss.cpp:7:22: note: passing argument to parameter here
void operator+(X, X);
^

编译器是否正确地让 block 声明在一种情况下隐藏全局名称而不是另一种情况?

最佳答案

你原来的问题:

你的结论是正确的。

operator+(a, a); 是一个简单的函数调用,因此编译器按标准顺序搜索潜在的匹配项,找到成员函数并且不再查找。成员函数不匹配,表达式格式不正确。

a + a; 使用 13.3.1.2 p3 中定义的一组略有不同的规则。首先从 A::operator+(a) 产生一组可能的重载。然后从标准的非限定查找生成可能的重载列表,但忽略成员函数。然后创建一个内置运算符列表。然后使用这 3 个列表来决定最佳匹配。通常,不合格的查找会在第一步之后停止,如果它找到了一些东西,这就是为什么它在通常会失败的地方工作的原因。

问题第 2 部分:

理论上这应该是一样的。没有涉及的成员函数和内置运算符是无关紧要的,因此它们都应该导致标准的非限定查找。我在标准中找不到任何建议它们应该以任何方式不同的东西。除了“它们存在”之外,我在标准中没有看到太多提及 block 作用域函数声明。毕竟,它们大多只是 C 的遗物。我也没有看到标准中的任何具体规则以一种或另一种方式说明这是否应该有效。该标准确实强烈建议 x + yoperator+(x, y) 要么都工作要么都失败,因为它们都使用相同的方法进行名称查找。

我还没有找到嵌套函数声明的有效用例。

关于c++ - 在 C++11 中查找运算符的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13869150/

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