C ++初始化列表和默认值

时间:2015-10-23 08:27:26

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

此代码对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

2 个答案:

答案 0 :(得分:3)

代码有效。

  1. (8.5.4 / 3):
  2.   

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

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

      这是   骨料   是一个数组或类(Clause    9   )没有用户提供的构造函数(   12.1   ),没有私人或   受保护的非静态数据成员(条款    11   ),没有基类(条款    10   ),没有虚拟功能(   10.3   )。

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

        

      这是   骨料   是一个数组或类(Clause    9   )没有用户提供的构造函数(   12.1   ),没有   支架或 - equal-   初始化   s用于非静态数据成员(   9.2   ),没有私有或受保护的非静态数据成员(条款    11   )   没有基类(条款    10   ),没有虚拟功能(   10.3   )。

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

      这是gcc5中的fixed(搜索&#34的更改列表;使用非静态数据成员初始值设定项进行聚合&#34;)。我不会把它称为&#34; bug&#34;但是,相反,gcc团队只在gcc 5.1.0中实现了这一变化。

答案 1 :(得分:3)

您发布的代码绝对正确。

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