2015-10-23 19 views
6

はC++ 14C++初期化子リストおよびデフォルト値

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

それが打ち鳴らす++ 7.0と罰金コンパイル、それは私が渡し--std = Cの両方のケースではG ++ 4.9では動作しませんと、このコードは有効です++ 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

おそらくgcc 4.9バグです。 – 101010

+3

古いg ++のバグです。それを新しいバージョンに更新すると、正常にコンパイルされます。 –

+0

@VictorPolevoyどのG ++バージョンをテストしましたか? –

答えて

3

コードは有効です。

  1. (8.5.4/3):

タイプ のオブジェクト又は基準のリスト初期化次のようにT が定義されている: - Tが集合体である場合、集約初期化が実行される

  1. aggr C++ 14にegateは(8.5.1/1)のように定義される:

凝集がないユーザ提供コンストラクタの配列またはクラス(箇条 9)( 12.1であります )、無保護されたプライベートまたは 非静的データメンバ(箇条 11)、無基底クラス(箇条 10)、およびno仮想関数( 10.3)。 C++ 11にこの定義は(強調鉱山)異なる見えたこと

凝集のないユーザ提供コンストラクタの配列またはクラス(箇条 9)であります( 12.1)、非静的データメンバーのない ブレース・オア・イコール 初期S( 9.2)、なし基底クラス(箇条 10)、およびno仮想関数( 10.3) 、非静的データメンバ(箇条 11)ないプライベートまたは保護されました。

この部分はC++ 14で削除されているため、構造体は確かに集合体なので、集約初期化を実行する必要があります。

これはgcc5内のfixedです(変更リストで「非静的データメンバー初期化子を含む集計」を検索してください)。私はそれを "バグ"と呼んでいませんが、むしろgccチームはgcc 5.1.0の変更を実装しただけです。

3

あなたが投稿したコードは間違いありません。

ただし、動作はG ++バージョン4.9.1のnot yet closed bugです。実際問題として、g++5.1.0またはそれ以前のバージョンで修正されているため、重複している可能性があります。実際のバグを見つけるにはbugzilla's searchを使用してください。

関連する問題