【发布时间】:2016-03-25 10:31:06
【问题描述】:
C++14 中的§5.19/3 定义了一个整型常量表达式和一个转换后的常量表达式:
整数常量表达式是整数或 无作用域枚举类型,隐式转换为纯右值,其中 转换后的表达式是核心常量表达式。 [注:这样 表达式可以用作数组边界(8.3.4、5.3.4),作为位域 长度(9.6),如果基础类型是枚举器初始化器 不固定(7.2),并作为对齐(7.6.2)。 —尾注] A 已转换
T类型的常量表达式是一个表达式,隐含 转换为T类型的纯右值,其中转换后的表达式为 核心常量表达式和隐式转换序列 仅包含用户定义的转换,左值到右值的转换 (4.1)、积分促销 (4.5) 和积分转换 (4.7) 其他 而不是缩小转换范围 (8.5.4)。 [注:这样的表达可能是 用于new表达式 (5.3.4),如case表达式 (6.4.2),如 如果基础类型是固定的(7.2),则枚举器初始化器,如 数组边界(8.3.4),并作为整数或枚举非类型模板 论据(14.3)。 ——尾注]
也许我遗漏了什么,但我的第一印象是每个整型常量表达式都是一个转换后的常量表达式。
编辑
而且我也认为这一段有错误:
代替:
A converted constant expression of type T is an expression, implicitly converted to a prvalue of type T, ...
应该是:
A converted constant expression of type T is an expression, implicitly converted to a prvalue of an integral type, ...
并且这个改变允许编译以下代码:
#include <iostream>
struct A { operator int() { return 5; } } a;
int main() {
int b[a]{ 0, 1, 2, 3, 4 };
std::cout << b[4] << '\n';
}
其中int b[a]{ 0, 1, 2, 3, 4}; 声明中的a 是A 类型的转换常量表达式,隐式转换为整数类型(int) 的纯右值,其中转换后的表达式@987654332 @是核心常量表达式,隐式转换序列只包含用户定义的转换。
【问题讨论】:
-
相反不是每个
converted constant expression都是integral constant expression? -
“转换后的 T 类型常量表达式是一个表达式,隐式转换为整数类型的纯右值,”这明显是错误的。
-
请注意,标准始终使用“
std::size_t的转换常量表达式”或“模板参数类型的转换常量表达式”,它从未说过“转换后的常量表达式,句号。”
标签: c++ language-lawyer c++14 constexpr