C++ 理解静态constexpr成员变量

C++ 理解静态constexpr成员变量,c++,c++11,constexpr,C++,C++11,Constexpr,对于C++11中的静态constexpr成员变量,我有一些困惑 一级水电站 我的理解(可能是错的)是,cond_I::value需要一个定义,但在前面的例子中,它只有声明。那么,cond_I::value呢?为什么它不需要定义 同样,在另一个头文件中,second.hpp,我有: 第二,hpp //空结构 模板 结构每股收益 { }; //特例 模板 结构每股收益 { 静态constexpr双值=1.0e-12; }; 模板 结构每股收益 { 静态constexpr浮点值=1.0e-6; };

对于C++11中的
静态constexpr
成员变量,我有一些困惑

一级水电站 我的理解(可能是错的)是,
cond_I::value
需要一个定义,但在前面的例子中,它只有声明。那么,cond_I::value呢?为什么它不需要定义

同样,在另一个头文件中,
second.hpp
,我有:

第二,hpp
//空结构
模板
结构每股收益
{ };
//特例
模板
结构每股收益
{
静态constexpr双值=1.0e-12;
};
模板
结构每股收益
{
静态constexpr浮点值=1.0e-6;
};
在这种情况下,以下代码在没有任何
eps::value
定义的情况下工作正常

在main()函数中
cout根据标准9.4.2/p3静态数据成员[class.Static.data](Emphasis Mine):

如果非易失性const静态数据成员是整型或枚举类型,则其在类定义中的声明可以指定一个大括号或相等的初始值设定项,其中作为赋值表达式的每个初始值设定项子句都是常量表达式(5.20)可以在类定义中使用
constexpr
说明符声明文本类型的静态数据成员;如果是这样,其声明应指定一个大括号或相等的初始值设定项,其中作为赋值表达式的每个初始值设定项子句都是常量表达式。[注:两者均适用 在这些情况下,该成员可能出现在常量表达式中。-结束注释]如果在程序中使用odr(3.2),则该成员仍应在名称空间范围中定义,且名称空间范围定义不应 包含初始值设定项。


正如M.M之前在注释
ostream::operatorI中所解释的,我认为答案是因为
ostream::operatories。没有任何参考,第一个代码可以工作
float
double
通过值传递,因此第二个代码工作。谢谢。相关:@vsoftco谢谢你的留言。该线程包含一些有用的解释。我没早点找到它。
template<typename T>
struct cond_I
{ static constexpr T value = 0; }; 


// specialization 
template<typename T>
struct cond_I< std::complex<T> >
{ static constexpr std::complex<T> value = {0,1}; }; 
cout << cond_I<double>::value << endl;            // this works fine
cout << cond_I< complex<double> >::value << endl; // linker error
template<typename T1> 
constexpr std::complex<T1> cond_I< std::complex<T1> >::value;
// empty struct
template<typename T>
struct eps
{ };


// special cases
template<>
struct eps<double>
{
  static constexpr double value = 1.0e-12;
};

template<>
struct eps<float>
{
  static constexpr float value = 1.0e-6;
};
cout << eps<double>::value << endl;    //  works fine
cout << eps<float>::value << endl;     //  works fine