[英]How to access the address of a static const member of a class?
该代码不会编译,并且错误信息是“ 未定义对`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无法编译?
放
const int A::a;
在源文件中,否则编译器不会为a生成地址。 注意,此处不重复该值。
该代码无法编译
该代码不链接 ,但可以编译。 如果要使用static const
成员的地址,则需要一个定义 ,因此只需添加类似于第二个代码片段的定义即可:
const int A::a;
取的地址A::a
装置A::a
是ODR -二手,和从部分中的C ++ 11标准(草案n3337)的9.4.2静态数据成员 ,第3:
如果非易失性const静态数据成员是整数或枚举类型 ,则其在类定义中的声明可以指定大括号或相等初始化器,其中作为赋值表达式的每个初始化器子句都是一个常数表达式(5.19) 。 可以使用constexpr说明符在类定义中声明文字类型的静态数据成员; 如果是这样,则其声明应指定一个花括号或相等的初始化程序,其中每个作为赋值表达式的初始化程序子句都是一个常量表达式。 [注意:在这两种情况下,成员都可能出现在常量表达式中。 — [end note] 如果在程序中使用了成员 (3.2),则该成员仍应在名称空间范围中定义,并且该名称空间范围定义不应包含初始化程序。
由于要获取地址,因此仍然需要定义静态成员,就像对非const版本所做的那样:
int A::a;
对于const
版本,您还需要
const int A::a;
请参阅此处进行良好的讨论-标题引号“编译时常量没有地址”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.