Jos*_*vin 2 c++ standards static templates const
我无法确定这些代码是否应该编译,或者我只是尝试了两个编译器都有错误(GCC 4.2和Sun Studio 12).通常,如果您在头文件中声明了静态类成员,则需要在某个源文件中定义它.但是,静态常量积分的标准中存在例外.例如,允许这样做:
#include <iostream>
struct A {
static const int x = 42;
};
Run Code Online (Sandbox Code Playgroud)
无需在类体外部添加x的定义.我正在尝试做同样的事情,但我也取x的地址并将其传递给模板.这导致链接器错误抱怨缺乏定义.下面的例子没有链接(缺少A :: x的定义),即使它们都在同一个源文件中:
#include <iostream>
template<const int* y>
struct B {
static void foo() { std::cout << "y: " << y << std::endl; }
};
struct A {
static const int x = 42;
typedef B<&x> fooness;
};
int main()
{
std::cout << A::x << std::endl;
A::fooness::foo();
}
Run Code Online (Sandbox Code Playgroud)
这是奇怪的,因为只要我不将地址传递给模板,它就可以工作.这是一个错误还是某种技术上符合标准的?
编辑:我应该指出&A :: x 不是运行时值.在编译时为逻辑分配的变量留出内存.
要成为一个格式良好的程序,你必须定义静态变量(在这种情况下没有初始化程序),如果它实际被使用,并将地址计数作为一个用途:
如果静态数据成员是const integer或const枚举类型,则它在类定义中的声明可以指定一个常量初始化器,它应该是一个整型常量表达式(5.19).在这种情况下,成员可以出现在整数常量表达式中.如果在程序中使用该成员,并且名称空间范围定义不包含初始化程序,则该成员仍应在名称空间作用域中定义