我有自己的固定大小的数组类型,我希望 constexpr
可以从 std::initializer_list
构造,而不必显式定义大小模板参数。
我以为我可以使用模板推导指南,但它似乎没有将 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()
路线的情况下完成这项工作?
最佳答案
你可以这样做:
template <class T, class... U>
array(T, U...) -> array<T, 1 + sizeof...(U)>;
问题不在于你不能在演绎指南中调用 constexpr
函数。你可以。这个例子很荒谬,但很有效:
constexpr size_t plus_one(size_t i) { return i + 1; }
template <class T, class... U>
array(T, U...) -> array<T, plus_one(sizeof...(U))>;
问题在于函数参数不是 constexpr
对象,因此如果这些成员函数读取某种本地状态,则无法在它们上调用 constexpr
成员函数。
关于c++ - 模板推导指南可以调用 constexpr 函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54066651/