1

这段代码没有编译,错误信息是“ undefined reference to `A::a' ”:

代码1:

#include <iostream>
using namespace std;

class A
{
public:
    static const int a=0;
};

int main()
{
    cout<<&A::a<<endl;
    return 0;
}

但是对于非常量静态成员,它会编译:

代码2:

#include <iostream>
using namespace std;

class A
{
public:
    static int a;
};
int A::a=0;

int main()
{
    cout<<&A::a<<endl;
    return 0;
}

有没有办法访问一个类的静态 const 成员的地址?如果有,怎么做?为什么代码 1 不能编译?

4

3 回答 3

11

const int A::a;

在源文件中,否则编译器不会为 a 生成地址。请注意,此处不再重复该值。

于 2013-08-07T15:11:42.267 回答
8

此代码无法编译

代码没有链接,它会编译。如果要使用该static const成员的地址,则需要一个定义,因此只需添加类似于第二个代码片段的定义:

const int A::a;

A::a手段的地址A::aodr -used,并且来自C++11 标准(草案 n3337)的第9.4.2 节静态数据成员,第 3 节:

如果非易失性 const 静态数据成员是整数或枚举类型,则其在类定义中的声明可以指定一个大括号或等式初始化器,其中作为赋值表达式的每个初始化器子句都是一个常量表达式 (5.19) . 可以在类定义中使用 constexpr 说明符声明文字类型的静态数据成员;如果是这样,它的声明应指定一个大括号或等式初始化器,其中作为赋值表达式的每个初始化器子句都是一个常量表达式。[ 注意:在这两种情况下,成员都可能出现在常量表达式中。—尾注]如果成员在程序中被 odr-used (3.2) 并且命名空间范围定义不应包含初始化程序,则该成员仍应在命名空间范围内定义。

于 2013-08-07T15:11:38.673 回答
1

由于您要获取地址,因此您仍然需要定义静态成员,就像您所说的非常量版本一样

int A::a;

对于const您还需要的版本

const int A::a;

请参阅此处进行很好的讨论 - 标题引用“编译时常量没有地址”。

于 2013-08-07T15:13:16.743 回答