2013-07-05 10 views
13

Clang documentationはきちんとクラスまたは構造体は、ユーザー定義のデフォルトコンストラクタを持っていないユーザ定義のデフォルトコンストラクタ+クラス内イニシャライザ!=ユーザ提供のコンストラクタ?

場合は、C++ あなたは この([dcl.init]のようにそれのconstのインスタンスを構築するデフォルトを許可しないことを説明して、p9)

constオブジェクトが正しく初期化されていないと、それ以降は変更できないという根拠があります。次のコードは、TestのためだけUSER- 宣言デフォルトコンストラクタを持っていますが、そのすべてのメンバーは、クラス初期化子を持って、

#include<iostream> 

class Test 
{ 
public: 
    Test() = default; 
    void print() const { std::cout << i << "\n"; } 
private: 
    int i = 42; // will propagate to the default constructor! 
}; 

int main() 
{ 
    Test const t; // <-- Clang chokes on the const keyword, g++ does not 
    t.print(); // prints 42 
} 

ので、理論的根拠もデフォルトコンストラクタが私に余分思えるを提供をUSER- 。実際、g ++ 4.8.1は問題なくコンパイルしますが(Online Example)、Clang < = 3.2ではありません。

質問:なぜ完全なクラス内インサイザ+ユーザ定義のデフォルトコンストラクタの組み合わせは、constオブジェクトをデフォルトで構築するのに十分ではありませんか? C++ 14標準の修正が進んでいますか?

UPDATE:誰でもClang 3.3/3.4を試して、これがClang 3.2と比較して修正されているかどうか確認できますか?

+2

これはClangの間違い/バグだと思うし、g ++はコードを受け入れるのが正しい。 –

+0

@JerryCoffinそれに沿った標準的な見積もりはありますか?クラス内のイニシャライザがなければ、スタンダードはClangが正しいと言います。 – TemplateRex

+1

実際には引用符ではなく、N3337によって、この要件が消えてしまったので、その文言は既に変更されていました。それが標準であるとすれば、間違いやバグはおそらくわずかに間違っていると思われますが、現時点ではほとんどのコンパイラがC++ 11 *を無視し、新しいドラフトを追求していると思います。 –

答えて

11

はい、これは既知の問題です。 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#253を参照してください。それはまだ仕様では修正されていません。

+0

+1と受け入れます。それがレーダー上にあることを知ってうれしい。 – TemplateRex

+0

Clang 3.3/3.4に問題があるかどうかチェックする機会がありますか? – TemplateRex

+0

@TemplateRex残念ながら、clang 3.4(トランク184647)ではまだ問題があります。 :( – Ali

関連する問題