對於下面的代碼,爲什麼沒有重新聲明Foo :: bar的第一個主要工作正常工作,而第二個功能需要它?C++靜態constexpr成員重新聲明以外的類
struct Foo{
static constexpr int bar = 30;
};
//Declaration of Foo::bar outside of struct
constexpr int Foo::bar;
int returnconstexpr(const int& x) { return x; }
int main()
{
//Ok without declaration outside of struct
std::cout << Foo::bar << std::endl;
//Requires declaration outside of struct
std::cout << returnconstexpr(Foo::bar) << std::endl;
//Here static constexpr works as a definition
static constexpr int x = 2;
std::cout << returnconstexpr(x) << std::endl;
return 0;
}
我假定這是因爲在第一種情況下,編譯器真的只是堅持的價值,而在第二種情況下,功能要求其不存在沒有重聲明的地址。如果是這樣,那麼我所說的是聲明實際上是一個定義?我對此感到困惑,因爲在課堂上提供了一個初始化程序,但它並不是一個定義。例如,第三個案例工作得很好。
正確的,這是有道理的,否則每次包含標題,它都會提供一個新的定義。謝謝。 – JamesLens
@JamesLens:對,爲了防止C++強制你在類之外定義靜態成員。 –