错误C3074:只能使用初始化列表初始化数组

Abh*_*jit 5 c++ arrays visual-c++ initialization-list c++11

我正在为POD,STL和Arrays等复合类型开发一台小型(漂亮)打印机.在这样做的同时,我也在摆弄初始化列表,并且遇到了以下声明

std::vector<double[3]> arr{ { 10, 11, 12 }, { 20, 21, 22 } }; 
Run Code Online (Sandbox Code Playgroud)

似乎VC2013和G ++ 4.8都不是很开心并发出一致的错误信息,无论哪种情况对我都没有帮助

对于VC++: error C3074: an array can only be initialized with an initialize-list

对于G ++ 4.8: error: array must be initialized with a brace-enclosed initialize

所以这里不能使用初始化列表,要么我的语法不正确?

在类似的方面,以下语法似乎是有效的

std::vector<std::array<int, 3>>  arr{ { 10, 11, 12 }, { 20, 21, 22 } };
Run Code Online (Sandbox Code Playgroud)

我的初始化列表可能有什么问题?

  • 注意我理解我应该使用std::array而不是C类型数组,但我只是在试验.
  • 注意如果您不想玩这个,这是一个IDEONE版本
  • 注意另外,如果您可以将我推荐回标准,那将是非常有益的.

Yak*_*ont 5

阅读当前的C++ 1y草案标准.

从表99之前:

T是EmplaceConstructible成从指定参数时,零个或多个参数ARGS X,意味着以下表达式是合式:allocator_traits ::构建体(M,P,参数)

表100:

X(il);              |  Equivalent to      | X(il.begin(), il.end());
--------------------+---------------------+--------------------------------
X(i, j);            |                     | Requires:
X a(i, j);          |                     | T shall be EmplaceConstructible
                                          | into X from *i.
Run Code Online (Sandbox Code Playgroud)

因此,std::vector<double[3]> v{ {1,2,3}, {4,5,6} };为有效当且仅当double[3]EmplaceConstructible{1,2,3}作为一个初始化列表的元素传递给一个std::vector<double[3]>.

还有一个关于前向迭代器的子句,但这没有问题(因为std::initialzier_list迭代器是前向迭代器).

std::vector<T>拿一个std::initializer_list<T>参数.

std::initializer_list<double[3]>候选人名单也是如此.

首先,std::initializer_list<double[3]> x = {{1.0, 2.0, 3.0}};无法在gcc中编译.但是假设这是gcc中的一个错误.

其次,::new (nullptr) double[3](std::initializer_list<double>{1.0, 2.0, 3.0});放置new,EmplaceConstructable减少到缺少合适的construct覆盖,无法编译.

所以double[3]不是EmplaceConstruble来自一个std::initalizer_list<double> 也不来自一个double[3]或其他任何东西(因为我使用了一个括号,而不是因为括号中的内容,在新的位置),因为错误发生,除非分配器做魔术我不知道要避免安置新的.

因此,您的代码违反了当前的标准草案,可能是C++ 11,当然还有C++ 03(对容器有更严格的要求).