2011-01-03 8 views
4

gccの実験ビルド4.6)(GCC 4.5/4.6付き)C++ 11の初期化構文の問題

これは有効なC++ 11でないか、gccの実装が不完全ですか?

編集:ここでは、コンパイラのエラーは、次のとおりです。

test.cpp: In function int main(): 
test.cpp:14:10: error: expected) before { token 
test.cpp:14:10: error: a function-definition is not allowed here before { token 
test.cpp:14:18: error: expected primary-expression before) token 
test.cpp:14:18: error: expected ; before) token 
+0

一般的に、特にGCC4.5.xの場合は後者が当てはまります。 GCC4.6.xはより完全ですがバグもあります。可能であれば更新してください。 – marko

答えて

3

が提案N2640によると、あなたのコードは動作するはず。一時的なSオブジェクトを作成する必要があります。 g ++は明らかにこのステートメントを(Sが期待する関数の)宣言として解析しようとするので、バグのように見えます。

+0

右、 'T t((S {1,、0.1}))'はgccでうまく動作しているようです。 –

0

括弧なしのコンストラクタを呼び出すために間違っているようで、これは動作するようです:

struct S 
{ 
    int a; 
    float b; 
}; 

struct T 
{ 
    T(S s) {} 
}; 

int main() 
{ 
    T t(S({1, 0.1})); // NO ERROR HERE, due to nice constructor parentheses 
    T a({1,0.1}); // note that this works, as per link of Martin. 
} 

あなたの例では、動作しないこと(少なくとも私:sに)論理的と思われます。 Sをvector<int>に置き換えると同じ結果が得られます。

vector<int> v{0,1,3}; // works 
T t(vector<int>{0,1,2}); // does not, but 
T t(vector<int>({0,1,2})); // does 
+0

それは 'T a({1,0.1});'が動作するのとまったく同じ理由で動作しませんか?すなわち 'T t(ベクトル({0,1,2}));' 'ベクトル'のコピーコンストラクタを呼び出すだけですか? – dvide

+0

まあ、ここでは2つのことができます:かっこを挿入するか、gccメーリングリストにメールを送ってこれについて議論してください。私が見ている主な問題は、この機能のための多くの提案と追加があり、GCCが実装したいものがどれかわかりません... – rubenvb

+0

@dvide right。 'T a({1,1})'は 'T 'のコピー/ムーブコンストラクタを呼び出し、そのコンストラクタの(reference-)パラメータを' T tmp = {1,1} 'で初期化されたように一時的に初期化します。 'S {1,1、} 'の代わりに' S({1,1}) 'と言うと、オブジェクトのメンバーを直接初期化するのではなく、無駄なコピー/移動コンストラクタ呼び出しを追加しただけです。 –