gpt4 book ai didi

c++ - 名称查找中的重载解析/歧义(哪一个)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:13:22 25 4
gpt4 key购买 nike

$7.3.3/14 (C++03)

struct A { int x(); };
struct B : A { };
struct C : A {
using A::x;
int x(int);
};
struct D : B, C {
using C::x;
int x(double);
};
int f(D* d) {
return d->x(); // ambiguous: B::x or C::x
}

“f”中代码中的注释表明可以预期“B::x”或“C::x”之间存在歧义。

然而,在使用 g++(ideone) 或 Comeau 编译时,错误略有不同。这些错误不是指示 B::x 或 C::x 中的歧义,而是指示 A 是 D 的歧义基这一事实

prog.cpp: In function ‘int f(D*)’: prog.cpp:16: error: ‘A’ is an ambiguous base of ‘D’

"ComeauTest.c", line 21: error: base class "A" is ambiguous return d->x(); // ambiguous: B::x or C::x

按照 $10.2 中的名称查找规则,我觉得代码片段中的注释并不正确。该错误确实首先与基类“A”的歧义有关,而不是其他任何事情(例如,重载决策中的歧义)。有什么想法吗?

最佳答案

这是由 C++03 中名称查找的扭曲引起的:检查明确的子对象是 C++03 中类成员名称查找的一部分。在 C++03 中查找将找到 D::X 和 C::x 和 A::x,其中 A::x 匹配,但与类型 A 的两个不同子对象相关联。

在 C++0x 中,检查明确的子对象现在是相应子条款的一部分,参见 DR #39 : x 直接属于的类是一个不明确的基类 - 因此第 5 条将导致编译错误,而不是第 10 条。

请注意,注释讨论的是 A 的子对象。 A 的一个子对象通过路径 BA 的另一个子对象通过路径 C .这就是注释说“B::xC::x”的原因。同一类类型的多个子对象的存在可以通过尝试转换为其类类型来确定,忽略可访问性问题:如果转换不明确,则子对象出现多次。

关于c++ - 名称查找中的重载解析/歧义(哪一个),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4130201/

25 4 0
文章推荐: c++ - 如何获取指向托管 activex 控件的 标记的 IHTMLElement 指针