前の質問の興味深いフォローアップとして(ただし、実用的にはそれほど重要ではありません)、 C ++では、変数を宣言するときに変数名を括弧で囲むことができるのはなぜですか。
括弧内の宣言と注入されたクラス名機能を組み合わせると、コンパイラの動作に関して驚くべき結果になる可能性があることがわかりました。
次のプログラムを見てください。
#include <iostream>
struct B
{
};
struct C
{
C (){ std::cout << "C" << '\n'; }
C (B *) { std::cout << "C (B *)" << '\n';}
};
B *y = nullptr;
int main()
{
C::C (y);
}
g ++ 4.9.2でコンパイルすると、次のコンパイルエラーが発生します。
main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
MSVC2013 / 2015で正常にコンパイルされ、印刷されます
C (B *)
clang 3.5で正常にコンパイルされ、出力されます
C
だから、義務的な質問はどちらが正しいですか?:)
(私は強くclangバージョンに向かって動いており、技術的にtypedefを変更した後に変数の宣言を停止するmsvcの方法はtypedefがちょっと奇妙に見えます)
C::C
タイプを指定するのではなく、関数を指定するので、GCCはまさにimoです。
C::C y;
意味がありませんよね?どちらもないC::C (y);
最初に私にはこれが最も難問-解析のインスタンスだと思ったんstackoverflow.com/questions/tagged/most-vexing-parseが、今私はそれがすべての3つのコンパイラであるという意味だけで未定義の動作だと思う「右」。