std::integral_constant<T, v>::value 总是有一个定义吗?
Does std::integral_constant<T, v>::value always have a definition?
在 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,
由于静态数据成员对于函数、函数模板、对象和值,库子句指定声明。实现 应提供与库条款中的描述一致的定义。
是"对象",因此标准似乎要求标准库类的所有静态数据成员都具有定义。(例外:引用类型的静态数据成员不是"对象"。我想它们可能被认为是"价值",因此也需要有定义。我也不认为标准库中有任何引用类型的静态成员,所以这一点是没有意义的。
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 有没有可能有一个只有ADL才能找到的非好友功能
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 在学习数据结构之前对STL有一个了解是好的吗?
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 我的输出中有一个额外的 0,为什么会这样
- 节点是否为空,即使它有一个值?
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- 在 Stream C++ 文本之前有一个额外的换行符
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- std::integral_constant<T, v>::value 总是有一个定义吗?
- JsonCpp - 当有一个 json::Value 对象时,我怎么知道它的键名?