Arm*_*fai 7 c++ arrays static member
class armon
{
static const int maxSize=10;
int array[maxSize];
int count=0;
int* topOfStack=array;
}
Run Code Online (Sandbox Code Playgroud)
为什么maxSize需要static在数组中使用它?
qua*_*dev 14
它不具有是静态的,但它必须是一个常量表达式.
C++标准§8.3.4[dcl.array](强调我的):
如果存在constant-expression(5.19),则它应该是std :: size_t类型的转换常量表达式,并且其值应大于零
也就是说,以下内容也是有效的:
constexpr std::size_t Size() { return 10; };
struct Y
{
int array[Size()];
};
Run Code Online (Sandbox Code Playgroud)
注意:
由于编译器需要知道类的大小,所以不能这样做:
struct Y
{
const int size = 10;
int array[size];
};
Run Code Online (Sandbox Code Playgroud)
可能会制作Y不同大小的不同实例.
另外请注意,在这种情况下,int array[size]是不恒定的表达,因为它利用的this,见C++标准部§5.19 [expr.const]:
条件表达式e是核心常量表达式,除非根据抽象机器(1.9)的规则评估e将评估以下表达式之一:
- 这个(5.1.1),除了在constexpr函数或constexpr构造函数中被评估为e的一部分;
(评价size真的是this->size)
这个问题有两个方面
方面1
C++数组具有固定大小,在编译期间需要知道其大小.如果在运行时期间需要延迟决策,则数组表达式将变得格式不正确.
方面2
将成员变量声明为非静态变量使其成为实例变量,其值仅在实例化对象时才存在,该变量在运行时完成.静态变量是一个类变量,其值可以在编译期间确定.
你的特殊例子成为经典的鸡蛋悖论.
class armon
{
static const int maxSize=10;
int array[maxSize];
}
Run Code Online (Sandbox Code Playgroud)
armon,您需要知道它的大小.armon.armon,您需要知道它的大小.因此,您的数组大小因变量应该是一个常量表达式,在您的特定情况下应该是一个静态变量,
| 归档时间: |
|
| 查看次数: |
912 次 |
| 最近记录: |