我對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