我对static
const
成员的课程初始化有点困惑。例如,在下面的代码:类中静态常量ODR
#include <iostream>
struct Foo
{
const static int n = 42;
};
// const int Foo::n; // No ODR
void f(const int& param)
{
std::cout << param << std::endl;
}
int g(const int& param)
{
return param;
}
template<int N>
void h()
{
std::cout << N << std::endl;
}
int main()
{
// f(Foo::n); // linker error, both g++/clang++
std::cout << g(Foo::n) << std::endl; // OK in g++ only with -O(1,2 or 3) flag, why?!
h<Foo::n>(); // this should be fine
}
我不限定Foo::n
(线被注释)。所以,我预计电话f(Foo::n)
在链接时失败,事实上它确实如此。但是,每当我使用优化标志(如-O1/2/3
)时,以下行std::cout << g(Foo::n) << std::endl;
仅由gcc编译和链接(clang仍会发出链接器错误)。
- 为什么海湾合作委员会(试图用gcc5.2.0和gcc 4.9.3)编译和链接代码时优化是否已经开启?
- 我正确地说,在课堂上静态const成员的唯一用法是在常量表达式,如模板参数如
h<Foo::n>
调用,在这种情况下代码应链接?
[odr违规不需要诊断](http://stackoverflow.com/a/28446388/1708801)。 –
这是专门针对C++ 11的问题吗? odr引号[在C++ 11和C++ 14之间改变了一点](http://stackoverflow.com/a/28846608/1708801),虽然我不认为它在这种情况下确实很重要,但在某些情况下它确实。 –
@ShafikYaghmour我用'-std = C++ 11'编译,但问题本身不一定只用C++ 11(或C++ 14)。 O也观察到与'-std = C++ 98'相同的行为。 – vsoftco