std :: integral_constant <t,v =“”> :: value是否始终具有定义?

时间:2019-04-02 15:52:29

标签: c++ c++14

在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成员成为隐式内联的,从而使类内声明成为定义。)

2 个答案:

答案 0 :(得分:3)

[contents]/1中的一揽子声明涵盖了这一点,该声明定义了标准库实现的一般规则:

  

C ++标准库为以下类型的实体提供了定义:宏,值,类型,模板,类,函数,对象。

非引用类型的变量是对象,因此value是对象。因此,标准库必须为其提供一个定义。

C++17 version of this statement在此问题上更为直接:

  

C ++标准库提供了有关C ++标准库头文件提要中描述的实体和宏的定义。

value无疑是一个实体,在C ++标准库标头的摘要中对此进行了描述。因此,必须提供一个定义。

答案 1 :(得分:0)

根据[intro.compliance] / 4,

  

对于函数,函数模板,对象和值,库子句指定声明。实作   应提供与库条款中的描述一致的定义。

由于静态数据成员是“对象”,因此标准似乎要求标准库类的所有静态数据成员都具有定义。 (例外:引用类型的静态数据成员不是“对象”。我想它们可能被视为“值”,因此也需要具有定义。我也不认为在引用类型中有任何引用类型的静态成员。标准库,所以这一点没有意义。)