gpt4 book ai didi

c++ - 下面的代码无法编译。可能是因为带有 std=c++2a 的 GCC 仍然没有完全跟上最新的草案

转载 作者:太空宇宙 更新时间:2023-11-04 14:52:12 26 4
gpt4 key购买 nike

[class.mem]/6 :

A complete-class context of a class is a

(6.1) function body, (6.2) default argument, (6.3) noexcept-specifier ([except.spec]), (6.4) contract condition, or (6.5) default member initializer

within the member-specification of the class. [ Note: A complete-class context of a nested class is also a complete-class context of any enclosing class, if the nested class is defined within the member-specification of the enclosing class. — end note ]

这一段是在带有pull-request的草案中引入的#2231 .

据我所知,根据上面的注释,下面的代码应该可以编译。但是it doesn't .我假设 GCC 编译器仍未与最新草案保持同步。我是正确的,还是我对这篇笔记的理解不正确?

struct A {
int i = 1;
struct B {
int j = 2;
int f() {
return i + j;
}
};
};

失败的是:

source>: In member function 'int A::B::f()':
<source>:6:20: error: invalid use of non-static data member 'A::i'
6 | return i + j;
| ^
<source>:2:9: note: declared here
2 | int i = 1;
| ^

最佳答案

我认为这里的混淆源于完整类上下文的意义以及它打算如何使用。

重要的是,名称查找会在那里找到i。所以我可以这样写:

struct A {
struct B {
int j = 2;
int f() {
using T = decltype(i); // ok, even though 'i' declared later lexically
return T{} + j; // ok
}
};
int i = 1;
};

还有:

struct A {
struct B {
int j = 2;
int f() {
return i + j; // ok, even though 'i' declared later lexically
}
};
static const int i = 1;
};

的确,这在 C++11 中一直没问题。

但是 i 仍然是一个非静态成员,因此您只能从类型为 A 的对象的上下文中访问它。在 B 的成员函数体内,我们并没有隐含地拥有一个 A 对象。所以这样免费使用 i 仍然是错误的。


也就是说,这个:

I'm assuming that the GCC compiler is still not up to date with the most recent draft.

肯定是真的,而且会在相当长的一段时间内保持真实。

关于c++ - 下面的代码无法编译。可能是因为带有 std=c++2a 的 GCC 仍然没有完全跟上最新的草案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54696050/

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