$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:在函数‘int f(D*)’中:
prog.cpp:16: 错误:‘A’ 是
'D' 的基数不明确
And
“ComeauTest.c”,第 21 行:错误:基础
“A”类不明确
返回 d->x(); // 不明确:B::x 或 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
越过路径B
,以及另一个子对象A
越过路径C
。这就是为什么评论说“B::x
or C::x
”。相同类类型的多个子对象的存在可以通过仅尝试转换为其类类型来确定,忽略可访问性问题:如果转换不明确,则子对象会出现多次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)