std::integral_constant<T, v>::value 总是有一个定义吗?

Does std::integral_constant<T, v>::value always have a definition?

本文关键字:value 有一个 定义 gt integral constant lt std      更新时间:2023-10-16

在 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 个成员变得隐式内联,使类内声明成为定义。

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

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

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

这个声明的C++17版本在这个问题上更直接:

C++ 标准库为C++标准库标头概要中描述的实体和宏提供定义。

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

根据 [intro.compliance]/4,

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

由于静态数据成员

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

相关文章: