在C ++ 14标准中,std::integral_constant
模板的定义如下:
template <class T, T v>
struct integral_constant {
static constexpr T value = v;
typedef T value_type;
typedef integral_constant<T,v> type;
constexpr operator value_type() const noexcept { return value; }
constexpr value_type operator()() const noexcept { return value; }
};
并没有说静态数据成员即
是否有相应的脱机定义template <class T, T v>
constexpr T integral_constant<T, v>::value;
我仔细查看了标准,要求提供这样的定义,但是找不到一个定义,所以我不知道可移植代码是否可以滥用value
。
(在C ++ 17中,static constexpr
成员成为隐式内联的,从而使类内声明成为定义。)
答案 0 :(得分:3)
[contents]/1中的一揽子声明涵盖了这一点,该声明定义了标准库实现的一般规则:
C ++标准库为以下类型的实体提供了定义:宏,值,类型,模板,类,函数,对象。
非引用类型的变量是对象,因此value
是对象。因此,标准库必须为其提供一个定义。
C++17 version of this statement在此问题上更为直接:
C ++标准库提供了有关C ++标准库头文件提要中描述的实体和宏的定义。
value
无疑是一个实体,在C ++标准库标头的摘要中对此进行了描述。因此,必须提供一个定义。
答案 1 :(得分:0)
根据[intro.compliance] / 4,
对于函数,函数模板,对象和值,库子句指定声明。实作 应提供与库条款中的描述一致的定义。
由于静态数据成员是“对象”,因此标准似乎要求标准库类的所有静态数据成员都具有定义。 (例外:引用类型的静态数据成员不是“对象”。我想它们可能被视为“值”,因此也需要具有定义。我也不认为在引用类型中有任何引用类型的静态成员。标准库,所以这一点没有意义。)