调用模板参数 constexpr 方法?
calling a template parameter constexpr method?
std::array<...>::size()
是一种非static
constexpr
方法;constexpr
我可以将其用作模板参数:
#include <array>
#include <stdio>
int main(void) {
std::array<char, 12> a = {{ "Hello world" }};
std::cout << "size() = " << a.size() << ", data() = "" << a.data() << """ << std::endl;
std::array<char, a.size()> b = a;
std::cout << "size() = " << b.size() << ", data() = "" << b.data() << """ << std::endl;
}
但是,如果std::array<...>
是模板参数,则情况变得不确定:
template <typename T>
void copy(T const& a) {
std::array<char, a.size()> c = a;
std::cout << "size() = " << c.size() << ", data() = "" << c.data() << """ << std::endl;
}
GCC愉快地编译了这个[1],而CLANG拒绝了[2]
<source>:6:20: error: non-type template argument is not a constant expression
std::array<char, a.size()> c = a;
[1] https://godbolt.org/z/Ru7Y3F
[2] https://godbolt.org/z/LYJcpo
根据标准,哪一个是正确的?
附言 是的,我知道我可以使用std::tuple_size
来解决它:
template <typename T>
void copy(T const& a) {
std::array<char, std::tuple_size<T>::value> c = a;
std::cout << "size() = " << c.size() << ", data() = "" << c.data() << """ << std::endl;
}
Clang 是正确的。
您正在计算引用类型的 id 表达式 (a
(,该表达式没有前面的初始化,这在常量表达式中是不允许的。
[expr.const]/2:
表达式
e
是核心常量表达式,除非按照抽象机器的规则计算e
将计算以下表达式之一:
- 引用
。
引用类型的变量或数据成员的ID 表达式,除非引用具有前面的初始化,并且
它使用常量表达式或
它的生命周期始于对
e
的评估;。
相关文章:
- 类无法访问自己的私有静态 constexpr 方法 - Clang bug?
- 从非类型模板参数声明 constexpr 数组的可移植方法
- 调用模板参数 constexpr 方法?
- MSVC使用constexpr-if从可变模板方法中的基本模板参数中吞下const
- 强制 constexpr 函数的 constexpr 的惯用方法
- 用霍纳方法进行多项式求值的C++ constexpr
- 为什么 constexpr 假设我的方法就是 const
- 是否有一种方法可以避免标头文件中使用的constexpr函数输入全局范围,而无需额外的名称空间
- 使用方法失败更改constexpr对象成员
- 当应用于静态方法时,为什么constexpr属性不起作用
- 如何在 C++11 中编写这个 C++17 静态 constexpr 方法
- 只要调用的函数是用constexpr指定的,就将委托方法声明为constexpr
- 使用constexpr方法在结构内部进行模板参数化
- 带字符串操作变通方法的constexpr
- 是否有模板/constexpr/ c++ 11替代x -宏的方法?
- Constexpr类与数组构造函数方法
- 静态constexpr方法实现导致GCC错误
- 在c++ 11或更高版本中,是否有一种方法可以让constexpr在没有UB的情况下确定endian ?
- 声明constexpr函数或方法
- 在C++11中计算编译时的斐波那契数(递归方法)(constexpr)