没有定义结构的静态const成员

时间:2014-12-18 20:53:23

标签: c++

使用符合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,它适用于所有情况。 我们肯定在未定义行为的土地上吗?

1 个答案:

答案 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;
}