此代码对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
答案 0 :(得分:3)
代码有效。
对象或类型引用的列表初始化 Ť 定义如下: - 如果 Ť 是聚合,执行聚合初始化
这是 骨料 是一个数组或类(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。