为什么即使成员函数是constexpr,也需要constexpr
Why is constexpr required even though member function is constexpr?
除非我将constexpr放在initializer_list之前,否则以下内容不会编译:
constexpr std::initializer_list<int> il = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
};
std::array<int, il.size()> a;
但initializer_list大小为constexpr:
constexpr size_type size() const;
std::initializer_list<int> il = rand() ? std::initializer_list<int>{1}
: std::initializer_list<int>{1,2,3};
std::array<int, il.size()> a;
这就是为什么。
constexpr
成员函数是一个可以在常量表达式中执行的函数,它不一定会产生编译时常量的结果。例如:
struct S
{
int m;
constexpr int foo() const { return m; }
};
S s{rand()};
int j = s.foo(); // only known at run-time
constexpr S cs{42};
int arr[cs.foo()]; // compile-time constant
通过编写std::array<int, il.size()> a;
,您声称il.size()
可以在编译时使用常量结果进行评估,从而允许模板实例化。
这就是为什么initializer_list::size()
方法和il
变量都需要声明为constexpr
。
相关文章:
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 初始化模板化类中的静态 constexpr 成员
- 静态 constexpr 成员变量初始化
- 使用静态 constexpr 成员的未解析外部符号
- 使用模板参数还包括 constexpr 成员函数enable_if单独定义和声明模板成员函数
- Constexpr成员函数
- 在模板定义中调用非静态constexpr成员函数
- 在构造函数中使用 constexpr 成员
- emplace_back会导致静态 constexpr 成员上出现链接错误
- l值引用对象上的Constexpr成员函数:Clang和gcc不同意
- 通过呼叫constexpr函数来定义静态constexpr成员
- constexpr:constexpr成员的定义和声明
- 在定义(.cpp文件)中初始化静态浮点 constexpr 成员是可能的
- Clang声称通用lambda参数的constexpr成员不是constexpr
- C 私有静态constexpr成员变量
- constexpr 成员函数,C++中的 std::向量数据成员
- 跨编译器的 constexpr 成员函数的重载解析不一致
- 对静态 constexpr 成员的未定义引用仅由值使用
- 将模板结构用作模板参数与静态constexpr成员
- 从成员变量访问静态 constexpr 成员,GCC 错误?