【问题标题】:C++ initializer list and default valuesC++ 初始值设定项列表和默认值
【发布时间】:2016-01-22 17:29:39
【问题描述】:

这段代码对 C++14 有效吗

using namespace std;
struct Point
{
  int x = 0;
  int y = 0;
};
Point p2 {1, 1};

它在 clang++ 7.0 下编译得很好,在这两种情况下它都不适用于 G++ 4.9 我将 --std=c++1y 传递给编译器。

在 G++ 中,当我从结构定义中删除默认值时,它会起作用。

g++ test_constexpr_ctor.cc --std=c++1y -o test
test_constexpr_ctor.cc:7:15: error: no matching function for call to ‘Point::Point(<brace-enclosed initializer list>)’
Point p2 {1, 1};
            ^
test_constexpr_ctor.cc:7:15: note: candidates are:
test_constexpr_ctor.cc:1:8: note: constexpr Point::Point()
struct Point
        ^
test_constexpr_ctor.cc:1:8: note:   candidate expects 0 arguments, 2 provided
test_constexpr_ctor.cc:1:8: note: constexpr Point::Point(const Point&)
test_constexpr_ctor.cc:1:8: note:   candidate expects 1 argument, 2 provided
test_constexpr_ctor.cc:1:8: note: constexpr Point::Point(Point&&)
test_constexpr_ctor.cc:1:8: note:   candidate expects 1 argument, 2 provided

【问题讨论】:

标签: c++ g++ c++14


【解决方案1】:

代码有效。

  1. (8.5.4/3):

对象或引用类型的列表初始化 吨 定义如下: — 如果 吨 是聚合,执行聚合初始化

  1. c++14 中的聚合定义为 (8.5.1/1):

一个 总计的 是一个数组或一个类(子句 9 ) 没有用户提供的构造函数 ( 12.1 ),没有私人或 受保护的非静态数据成员(条款 11 ),没有基类(子句 10 ),并且没有虚函数 ( 10.3 )。

请注意,在 c++11 中,这个定义看起来不同(强调我的):

一个 总计的 是一个数组或一个类(子句 9 ) 没有用户提供的构造函数 ( 12.1 ), 没有 大括号或等于 初始化器 s 用于非静态数据成员 ( 9.2 ),没有私有或受保护的非静态数据成员(条款 11 ), 没有基类(条款 10 ),并且没有虚函数 ( 10.3 )。

由于这部​​分在 c++14 中被删除,你的结构肯定是一个聚合,因此应该执行聚合初始化。

这是 gcc5 中的fixed(在更改列表中搜索“带有非静态数据成员初始化程序的聚合”)。不过,我不会称其为“错误”,而是 gcc 团队仅在 gcc 5.1.0 中实现了该更改。

【讨论】:

    【解决方案2】:

    您发布的代码绝对正确。

    但是,您的行为是 G++ 版本 4.9.1 的 not yet closed bug。实际上,它可能是重复的并在其他一些错误报告中关闭,因为该问题自 g++ 5.1.0 甚至更早版本以来已修复。要查找实际错误,您可以使用bugzilla's search

    【讨论】:

      猜你喜欢
      • 2012-12-24
      • 1970-01-01
      • 2020-09-21
      • 2020-11-16
      • 2019-10-30
      • 1970-01-01
      • 2013-06-12
      • 2014-05-06
      • 2019-04-16
      相关资源
      最近更新 更多