C++ 模板导出向导能否调用constexpr函数?

C++ 模板导出向导能否调用constexpr函数?,c++,c++17,constexpr,template-argument-deduction,C++,C++17,Constexpr,Template Argument Deduction,我有自己的固定大小数组类型,我希望它可以从std::initializer\u list构造而不必显式定义size模板参数 我想我可以使用一个模板推导指南,但它似乎没有将std::initializer\u list::size()作为它的constexpr函数 下面是一个尝试为std::array制作演绎指南的示例(它与我的类型类似,并且有相同的问题): 名称空间std { 模板数组(初始值设定项列表初始值设定项列表)->数组; } 静态constexpr std::array myArray

我有自己的固定大小数组类型,我希望它可以从
std::initializer\u list
构造而不必显式定义size模板参数

我想我可以使用一个模板推导指南,但它似乎没有将
std::initializer\u list::size()
作为它的constexpr函数

下面是一个尝试为
std::array
制作演绎指南的示例(它与我的类型类似,并且有相同的问题):

名称空间std
{
模板数组(初始值设定项列表初始值设定项列表)->数组;
}
静态constexpr std::array myArray={1,2,3};
静态constexpr std::数组myArray2={{1,2,3};
我在MSVC和Clang上试过,两者给出的错误大致相同:
myArray
有一个错误,抱怨函数的参数太多。
myArray2
说“替换失败[带T=int]:非类型模板参数不是常量表达式”

我尝试将
constexpr
放在演绎指南或函数参数的前面,但这两种方法都不允许,因此演绎指南似乎无效,即使它在
constexpr
上下文中可以正常工作


有没有一种方法可以在不走
make_array()
路线的情况下实现此功能?

参数/参数值不是
constepr

您可以使用可变模板在编译时知道大小,或者使用已知大小(
std::array
或C-array引用)键入

有没有一种方法可以在不走
make_array()
路线的情况下实现这一点

你为什么不试试下面的扣除指南呢

template <typename T, std::size_t N>
array(T const (&)[N]) -> array<T, N>;
模板
数组(T常量(&)[N])->数组;
这样,
myArray2={{1,2,3}}
中的参数就不会被解释为
std::initializer_list
(as参数不能被视为
constexpr
,因此它的
size()
不能用于模板参数),而是作为一个C样式的数组

因此可以推断,作为模板参数,类型和大小(
T
N
)以及大小(
N
)可以用作模板参数。

您可以执行以下操作:

template <class T, class... U>
array(T, U...) -> array<T, 1 + sizeof...(U)>;
问题是函数参数不是
constepr
对象,因此如果这些成员函数读取某种局部状态,则无法调用它们上的
constepr
成员函数

template <class T, class... U>
array(T, U...) -> array<T, 1 + sizeof...(U)>;
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))>;