2015-10-29 1 views
34

は以下のスニペットを考えてみましょう:自動復帰型減算は、複数の関数が同じ戻り値型を持つように強制しますか?

struct A 
{ 
    auto foo(), bar(); 
}; 

auto A::foo() { return 1; } 
auto A::bar() { return 'a'; } 

int main() 
{ 

} 

それはクラン++ 3.7.0で罰金コンパイルします。 G ++ 5.2.0で

それはfails

main.cpp: In member function 'auto A::bar()': 
main.cpp:7:24: error: inconsistent deduction for 'auto': 'int' and then 'char' 
auto A::bar() { return 'a'; } 

は同じ戻り値の型を持つように、単一のステートメントで宣言された自動戻り型推論力、複数の機能を、していますか?

+0

警告/エラーなしでMSVS 2015もコンパイルされます。 – NathanOliver

+5

ちょうど興味深い:だれでも今ここに見つかったコンパイラのバグをファイルしますか? –

+1

あなたの場合(https://goo.gl/i09xpE)、Clangは暗黙的に 'a'を97にキャストします。 – romeric

答えて

25

は、GCCは、この場合の権利挙動を有するが、唯一の一致によって(下記参照):

§7.1.6.4[dcl.spec.auto]/8

init-declarator-listに複数のinit-declaratorが含まれている場合、それらはすべて変数の宣言を形成します。

偶然によってのみなぜですか?エラーメッセージはヒントです。同じ戻り値の型を推測する関数を変更すると、GCCはコードをコンパイルします。誤解を招くものではありますが、ここでエラーを出すのは間違いありませんが、推測される型が矛盾している場合にのみそうします。常にエラーが発生するはずです。

+1

それで、スニペットが不正であり、 gccは「正解」ですか?またはコードを受け入れることに間違っているのですか? – nwp

+0

この引用符は、 'auto foo()、bar();'が変数ではなく関数を宣言しようとしているので不正な形式であることを意味していますか? – Ruslan

+0

chris、あなたの答えは、GCCが単一のステートメントで複数の関数宣言を使用することに基づいてコードを拒否するのと同じように聞こえます。これは許されている、私はより興味があるかどうか '自動'曖昧さにつながる –

24

はい。

autoは、「任意の型」を意味するものではなく、コンパイラが推定する特定の型を意味します。

これは関数宣言に固有のものではなく、auto i = 1, f = 4.7;も機能しません。

また、単一のステートメントで複数の関数を宣言することは、とにかく良い考えではありません。次の条件に基づいて

+3

標準参照を提供できますか?私は変数の場合、タイプ控除の曖昧さは失敗しますが、これはわずかに異なり、2つのコンパイラがこのテーマについて異なる見解を持っているので、私は明快であることを望みます –

関連する問題