繁体   English   中英

初始化汇总库(GCC和clang不同意)

[英]Initializing aggregate base (GCC and clang disagree)

以下代码在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>'

我想我正在用大括号括起来的初始化程序初始化基础聚合。 没有? 标准在这里对语法说什么?

那当然是允许的; 请参阅[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} {} 
};

这已在trunk: 带GCC trunk的演示中修复。

这就是为什么我不喜欢所谓的统一初始化 :)。 请使用以下代码:

  super(Ts&&... xs)
      : base({std::forward<Ts>(xs)...})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM