以下代码在clang 3.6(C ++ 14)上编译,但不在GCC 5.3(C ++ 14)上编译
#include <array>
#include <utility>
struct super: std::array<int, 3> {
using base = std::array<int, 3>;
template <typename... Ts>
super(Ts&&... xs)
: base{std::forward<Ts>(xs)...} {
// nop
}
};
int main() {
super obj(1, 2, 3);
}
产生的错误消息是
/tmp/gcc-explorer-compiler116029-73-105rz4g/example.cpp: In instantiation of 'super::super(Ts&& ...) [with Ts = {int, int, int}]':
15 : required from here
9 : error: array must be initialized with a brace-enclosed initializer
: base{std::forward<Ts>(xs)...} {
^
9 : error: too many initializers for 'std::array<int, 3ul>'
我认为我正在使用大括号括起初始化程序初始化基本聚合。没有?标准对此处的语法有什么看法?
答案 0 :(得分:5)
当然允许;请参阅 [array.overview],它保证array
的聚合初始化按照您的示例要求的方式工作。您在GCC的大括号中遇到了一个错误,如果聚合是基类,则该错误无法正常工作:
struct A {int i[1];}; // Equivalent to libstdc++'s std::array<int, 1> implementation
// for this demonstration
struct C : A {
C() : A{0} {}
};
已在行李箱中修复此问题:Demo with GCC trunk。
答案 1 :(得分:2)
这就是为什么我不喜欢所谓的统一初始化 :)。请改用以下代码:
super(Ts&&... xs)
: base({std::forward<Ts>(xs)...})