2016-03-25 10 views
7

私はC++を初めて使用しています。他の型の関数宣言を持つC++の型安全性違反?

#include<iostream> 

void t(){ 
    std::cout << "func t()" << std::endl; 
} 

int main(int argc, char **argv) { 
    int t(); //declaration of function 
    std::cout << t() << std::endl; 
} 

出力は "func t()\ n6295712"です。私の懸念は、t()によって印刷されたランダム(?)番号です。

私の質問は次のとおりです。エラーが発生していない別の戻り値型の関数(ここではintでvoidではなく)を宣言できるのはなぜですか?戻り値の型 "int"を持つ関数を決して定義していないので、これは型の安全性に違反していませんか?

使用されるコンパイラ:gccの(Ubuntuの4.8.4-2ubuntu1〜14.04.1)4.8.4

+0

私の出力は 'func t()\ n6295680'です。これは** **' 6295712'とだけ異なります。あなたのプログラムは実際にその番号だけを印刷していますか? –

+0

あなたは正しいです、私はそれを編集しました - 私は数に気を配り、他の出力を忘れていました。ありがとう –

+0

はwtfを確認できますhttp://coliru.stacked-crooked.com/a/f9b957636b731736 –

答えて

4

私は見つけることができる唯一の関連するものは[basic.scope.pdecl]中です。注:ブロックで

関数の宣言スコープとブロックスコープのextern指定子を持つ変数宣言は、囲む名前空間のメンバーである宣言を参照しますが、そのスコープに新しい名前を導入しません。

ですから、書くとき:

void t(); 

int main() { 
    int t(); // * 
} 

内側の宣言が囲んでいる名前空間のメンバーを参照すること。したがって、次のように書かれたことになります。

void t(); 
int t(); 

int main() {} 

しかし、関数は戻り値の型でのみオーバーロードすることはできません。したがって、このコードは不正です。 Clangは両方のプログラムを拒否し、gccは後者のみを拒否します。私はこれがgccバグだと信じています。

+1

あなたの答えをありがとう。私はgcc bugzilla https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70414にバグレポートを提出しました。これが確認されたら私はあなたの答えを受け入れるでしょう。 –

+0

's/override/overload/' –

+0

@BarryTheHatchet Woops、ありがとう – Barry

関連する問題