【发布时间】:2019-06-01 15:52:08
【问题描述】:
我有自己的固定大小的数组类型,我想从std::initializer_list 构造为constexpr,而不必显式定义大小模板参数。
我以为我可以使用模板推导指南,但它似乎没有将 std::initializer_list::size() 视为它的 constexpr 函数。
下面是一个尝试为std::array做推演指南的例子(和我的类型差不多,也有同样的问题):
namespace std
{
template<typename T> array(initializer_list<T> initialiserList) -> array<T, initialiserList.size()>;
}
static constexpr std::array myArray = {1,2,3};
static constexpr std::array myArray2 = {{1,2,3}};
我在 MSVC 和 Clang 上试过,都给出了大致相同的错误:
myArray 有一个错误,抱怨函数的参数太多。
myArray2 表示“替换失败 [with T = int]:非类型模板参数不是常量表达式”
我尝试将 constexpr 放在推导指南或函数参数的前面,但似乎都不允许,因此即使在 constexpr 上下文中应该可以正常工作,推导指南似乎也是无效的。
有没有办法在不走make_array() 路线的情况下完成这项工作?
【问题讨论】:
标签: c++ c++17 constexpr template-argument-deduction