gpt4 book ai didi

c++ - 声明与 const 变量和成员函数相同的标识符

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

我写了下面这段代码

#include <iostream>
const int N = 5;
class X
{
public:
int array[N];
void foo()
{
std::cout << "array size:"<<sizeof(array)/N << std::endl;
}
enum
{
N = 3
};
};

int main()
{
X x;
x.foo();
}

上述代码不能用 GCC 编译:

<source>:13:8: error: declaration of 'N' [-fpermissive]
N = 3
^
<source>:2:11: error: changes meaning of 'N' from 'const int N' [-fpermissive]
const int N = 5;
^

从我在编译时的角度来看,数组被定义为五个整数的数组,N 被定义为 5。编译器如何解析变量的名称声明?

最佳答案

在成员函数的范围内(甚至是内联定义的),该类被认为是完整的1。因此,使用 N 必须使用成员枚举器。并且它的值必须是 3。

但是,声明类成员数据时情况并非如此。此时(当指定 array 时),类不被认为是完整的。所以N只能引用之前看到的内容,这意味着它必须是全局常量。

Clang 接受它,但发出 6 (sizeof(int) * 5/3)。 GCC (8) 没有,但它并不是真正的无效代码。这只是容易出错。更好定义的方法是将枚举器移动到定义数组之前

enum { N = 3 };
int array[N];

...或者如果我们不这样做,那么我们可以使用范围解析来引用“正确的 N”

sizeof(array) / ::N

重新排列类定义会更好,因为它不会仍然容易出错(我们可以忘记使用限定的 ::N)。


1:来自最新的C++标准草案

[class.mem]/6

A complete-class context of a class is a

  • function body ([dcl.fct.def.general]),
  • default argument ([dcl.fct.default]),
  • noexcept-specifier,
  • contract condition ([dcl.attr.contract]), or
  • default member initializer

within the member-specification of the class.

关于c++ - 声明与 const 变量和成员函数相同的标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51942442/

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