#include <array>
template<class T, int N>
struct X {T array[N];};
int main() {
using std::array;
array<int,3> a{1,2,3}; //works
array<int,3> c{{1,2,3}}; //works
array b{1,2,3}; //works
array d{{1,2,3}}; //doesn't work
X<int,3> e{1,2,3}; //works
X<int,3> f{{1,2,3}}; //works
X g{1,2,3}; //doesn't work
X h{{1,2,3}}; //works
}
当我使用 CTAD 创建
std::array
变量(无模板参数)时,大括号省略似乎适用(或者它真的是大括号省略吗?),但是当我对我的类执行相同操作时(X
),它不适用不工作。
另外,我无法用双引号初始化
std::array
(因为它应该是一个内部有单个成员变量的聚合,一个 C 数组,双大括号不起作用吗?),而我可以这样做X
班。
如何使
X
类的行为与 std::array
在使用单大括号初始化它时的行为相同,而不使用显式模板参数?
编译器:gcc 14.2.1
标志: -std=c++23 -O2 -DNDEBUG`
如果您在 struct
中添加 扣除奎德
g
将起作用,而 h
将失败,与 std::array
相同。 例如:
template<class T, int N>
struct X {T array[N];};
template <class T, class... Others,
class = std::enable_if_t<(std::is_same_v<T, Others> && ...)>
>
X(T, Others...) -> X<T, 1 + sizeof...(Others)>;