结构模板上的大括号省略不像 std::array 那样工作

问题描述 投票:0回答:1
#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`

c++ arrays struct
1个回答
0
投票

如果您在 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)>;

在线演示

© www.soinside.com 2019 - 2024. All rights reserved.