使用符合03标准的编译器(gcc-3.3.2的安全关键变体)。 该标准规定必须定义静态成员对象(9.4.2(4))。它还指出单定义规则成立,但不需要诊断(9.4.2(5))。以下代码是否有效?
struct fred
{
static const int JOE=1;
int m_joe;
fred() : m_joe(JOE) {}
};
也就是说, 没有 “static const int fred :: JOE;”。 我问,因为我们有一个案例(显然),模板类中的静态const int从未被定义,并且代码在某些上下文中工作,但在其他情况下不起作用。我用枚举替换了静态const int,它适用于所有情况。 我们肯定在未定义行为的土地上吗?
答案 0 :(得分:1)
static const int
定义编译时常量;我担心我无法参考标准的特定部分。您需要定义它的唯一时间是您尝试获取它的地址或创建引用。如果您使用枚举,编译器将在您需要引用时为您创建临时变量。
struct test
{
static const int one = 1;
enum { two = 2 };
};
void printint(const int & i)
{
cout << i << endl;
}
int main() {
printint(test::one); // error
printint(test::two); // no error
return 0;
}