C++ 为什么我会得到;变量的实例化。。。此处需要,但没有可用的定义;用于静态双变量,但不用于int?

C++ 为什么我会得到;变量的实例化。。。此处需要,但没有可用的定义;用于静态双变量,但不用于int?,c++,llvm,C++,Llvm,我正在编译这个程序: template<int N> struct Foo { static const double value; }; int main() { auto const& value = Foo<1>::value; } 模板结构Foo{ 静态常数双值; }; int main(){ auto const&value=Foo::value; } 编译器输出头: $ clang++ -std=c++17 ./main.cpp -o

我正在编译这个程序:

template<int N> struct Foo {
  static const double value;
};

int main() {
  auto const& value = Foo<1>::value;
}
模板结构Foo{
静态常数双值;
};
int main(){
auto const&value=Foo::value;
}
编译器输出头:

$ clang++ -std=c++17 ./main.cpp  -o main
./main.cpp:6:31: warning: instantiation of variable 'Foo<1>::value' required here, but no definition is available [-Wundefined-var-template]
  auto const& value = Foo<1>::value;
                              ^
./main.cpp:2:23: note: forward declaration of template entity is here
  static const double value;
                      ^
./main.cpp:6:31: note: add an explicit instantiation declaration to suppress this warning if 'Foo<1>::value' is explicitly instantiated in another translation unit
  auto const& value = Foo<1>::value;
$clang++-std=c++17./main.cpp-o main
./main.cpp:6:31:警告:此处需要实例化变量“Foo::value”,但没有可用的定义[-Wundefined var template]
auto const&value=Foo::value;
^
./main.cpp:2:23:注意:此处是模板实体的转发声明
静态常数双值;
^
./main.cpp:6:31:注意:如果在另一个翻译单元中显式实例化了“Foo::value”,则添加显式实例化声明以抑制此警告
auto const&value=Foo::value;
锁销:

如果我将
double
更改为
int
,警告就会消失


这有没有原因在C++规范中,或者这个LLVM是不一致的吗?< /P>你需要初始化静态变量。据我所知,在标准中没有诊断需要(但是我不会把我的手放在火上…)所以llvm发布一个是很好的。。。不过,最后一句话似乎与我相矛盾:如果在另一个编译单元中已经有定义,那么在这里添加一个将导致双重定义。考虑到在另一个CU中出现的定义并不罕见,我甚至会认为警告不恰当……@阿空加瓜山的意思是添加一个声明,不是定义可能警告的差异与这样一个事实有关,即整型常量可以在类定义中定义,即使没有

constexpr
@M.M它要求定义(“变量实例化”)或在其他地方定义的语句。