gpt4 book ai didi

c++ - 下面的第一个片段编译,但第二个没有。为什么?

转载 作者:IT老高 更新时间:2023-10-28 13:57:53 25 4
gpt4 key购买 nike

下面的代码片段编译(demo):

struct A{ int i = 10; };

int main() {
struct A{ int i = 20; };
struct A;
struct A a;
}

但这不是:

struct A{ int i = 10; };

int main() {
// struct A{ int i = 20; };
struct A;
struct A a;
}

我可以看出标准中的这些段落可能给出了答案:

[basic.lookup.elab]/2[basic.scope.pdecl]/7 .

但我真的不知道如何从这两段中推断出上面显示的不同行为。

请注意,在第一个示例中,struct A 不是首先在 elaborated-type-specifier struct A 中声明; ,但是在main()struct A的定义中。

在第二个例子中,struct A 也是not首先在 elaborated-type-specifier struct A; ,但是在struct A的定义中,在全局范围内。

最佳答案

每个示例都包含两个不同类的声明,它们的名称都为 A

让我们通过将其中一个重命名为 B 来区分这些类:

struct A{ int i = 10; };

int main() {
struct B{ int i = 20; };
struct B;
struct B b;
}

以上在语义上与您的第一个示例相同。 A 类从未使用过。

struct A{ int i = 10; };

int main() {
struct B;
struct B b;
}

这在语义上与您的第二个示例相同。您正在尝试创建一个不完整类型的对象,即前向声明的类 B

B 重命名回 A 不会改变任何内容,因为 main 中的 A 声明会影响另一个 A 在全局范围内的声明。

[basic.lookup.elab]/2

If the elaborated-type-specifier has no nested-name-specifier, and [...] if the elaborated-type-specifier appears in a declaration with the form:

class-key attribute-specifier-seqopt identifier ;

elaborated-type-specifier 是一个声明,它引入了 [basic.scope.pdecl] 中描述的 class-name

所以 struct A; 是一个声明,它在声明的范围内引入类名。在任何情况下,它都不能引用在外部范围内声明的类。

[basic.scope.pdecl]/7

[ Note: Other forms of elaborated-type-specifier do not declare a new name [...] — end note ]

暗示,这种形式的详细类型说明符声明了一个新名称。

关于c++ - 下面的第一个片段编译,但第二个没有。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41471439/

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