在C ++中是否允许从括号列表中的值分配std :: array?

时间:2019-02-17 15:00:33

标签: c++ arrays c++11 language-lawyer

在c ++入门(第5版)中,提到不允许从大括号的值列表中分配std :: array。

  

因为右侧操作数的大小可能与大小不同   对于左侧操作数,数组类型不支持assign和   它不允许从大括号的值列表中赋值。

下面以代码为例。

  std::array<int, 10> a1 = {0,1,2,3,4,5,6,7,8,9}; 
  std::array<int, 10> a2 = {0}; // elements all have value 0
  a1 = a2; // replaces elements in a1
  a2 = {0}; // error: cannot assign to an array from a braced list

但是,当我使用c ++ 11编译器编译此code时,效果很好。现在可以使用吗?还是我想念什么?

1 个答案:

答案 0 :(得分:2)

是的,可以从括号列表中分配一个std::array。它只能在C ++ 11规则下正常工作-该类无需执行任何特殊操作即可支持它。 Consider

struct S {int x; int y;};
int main() {
  S s{1, 2};
  s = {3, 4};
}

S是一个聚合,可以通过大括号初始化列表构造。此外,S具有一个隐式声明的赋值运算符,它采用const S&。将两者放在一起,编译器将s = {3, 4}解释为s.operator=(S{3, 4})

std::array也会发生同样的情况。