gpt4 book ai didi

c++ - Derived1::Base 和 Derived2::Base 是否指代相同的类型?

转载 作者:行者123 更新时间:2023-12-01 09:14:31 27 4
gpt4 key购买 nike

MSVC、Clang 和 GCC 不同意此代码:

struct Base { int x; };
struct Der1 : public Base {};
struct Der2 : public Base {};

struct AllDer : public Der1, public Der2 {
void foo() {
Der1::Base::x = 5;
}
};

Godbolt

海湾合作委员会:
<source>: In member function 'void AllDer::foo()':    
<source>:10:21: error: 'Base' is an ambiguous base of 'AllDer'
10 | Der1::Base::x = 5;
| ^
Compiler returned: 1

Clang 给出了类似的错误,MSVC 没有给出错误。

谁在这里?

我想这在 [class.member.lookup] 中有所涉及,但我很难理解它在这个案例中试图告诉我什么。请引用相关部分,并在可能的情况下用简单的英语解释。

PS:灵感来自这个问题 Why is Reference to Base Class ambiguous with :: -operator trough derived class?

PPS:其实我的疑问是 Der1::Base指的是类型,即 Base (然后 Der2::Base 是完全相同的类型),或者到子对象。我确信它是第一个,但如果是后者,那么 MSVC 是正确的。

最佳答案

要回答标题中的问题,是的,Derived1::Base引用 injected-class-name [class.pre] Base Derived2::Base也是如此.两者均指类 ::Base .

现在,如果 Base将有一个静态成员 x ,然后查找 Base::x将是明确的。只有一个。

这个例子中的问题是 x是非静态成员,并且 AllDer有两个这样的成员。您可以通过 x 消除此类访问的歧义。通过指定 明确 AllDer的基类只有一个 x成员。 Derived1是一个明确的基类,它有一个 x成员(member),所以 Derived1::x明确指定两者中的哪一个 x成员(member)在 AllDer你的意思是。 Base也只有一个 x成员,但它不是 AllDer 的明确基础. AllDer的每个实例有两个 Base 类型的子对象.因此 Base::x在你的例子中是模棱两可的。从 Derived1::Base只是 Base 的另一个名字,这仍然是模棱两可的。

[class.member.lookup] 指定 x在嵌套名称说明符的上下文中查找,因此必须首先解析。我们确实在找Base::x ,不是 Derived1::x ,因为我们从解析 Derived1::Base 开始如 Base .
这部分成功了,只有一个xBase. [class.member.lookup] 中的注释 12 明确告诉您,当存在多个具有相同名称的子对象时,使用明确名称查找可能仍会失败。 D::i在那个例子中基本上是你的 Base::x .

关于c++ - Derived1::Base 和 Derived2::Base 是否指代相同的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61477009/

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