是否在c ++中允许从支持的值列表中分配std :: array?

bor*_*ree 6 c++ arrays language-lawyer c++11

在c ++ primer(第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
Run Code Online (Sandbox Code Playgroud)

但是,当我使用c ++ 11编译器编译此代码时,它工作正常.这是现在允许还是我错过了什么?

Igo*_*nik 4

是的,astd::array可以从花括号列表中分配。它只是在 C++11 规则下正常工作 - 该类不需要做任何特殊的事情来支持它。考虑

struct S {int x; int y;};
int main() {
  S s{1, 2};
  s = {3, 4};
}
Run Code Online (Sandbox Code Playgroud)

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

同样的情况也发生在std::array.