Visual Studio 2012 で関数を作成して、アイテムがデフォルトであるかどうかを確認し、それを呼び出しましたdefault()
。ただし、完了して数秒待ったときに、名前が太字ではなくなり、Intellisense エラーが表示されなくなったことに気付きました。興味をそそられて、私はそれを試しました:
void default(){}
int main() {
default();
}
このコードは、Visual Studio 2012 で通常のコンパイラと 2012 年 11 月の CTP コンパイラの両方で動作しますが、GCC 4.7.2 またはhttp://llvm.org/demoではコンパイルされません。default
スイッチと= default
一部のクラスメンバーの両方に使用されていることを認識しています。VS2012 は後者をサポートしていませんが、明らかに前者をサポートしており、関数名をdelete
、nullptr
、またはswitch
、またはに変更すると、実際に文句を言いcase
ます。
GCCでは、これを取得します:
エラー: 'default' の前に unqualified-id が必要です
関数 'int main()' 内:
エラー: ケース ラベルが switch ステートメント内にありません
エラー: '(' トークンの前に ':'が必要です
エラー: ')' トークンの前にプライマリ式が必要です
Clangは私にこれを与えます:
エラー: unqualified-id
void default(){}が期待されます
........^
私は明らかにその名前を変更していますが、VSはこれを受け入れるのが間違っていますか、それとも言語への追加で具体的= default
に変更されたのでしょうか? = delete
VS がそれをサポートしておらず、それがプログラムの誤りの原因である場合、それが受け入れられる理由がわかります。
仕様でこれを見つけました(C++ 11 § 6.1/2):
case ラベルと default ラベルは、switch ステートメントでのみ発生します。
コロンが後に続くラベルとして使用されていないため、許可されていると主張できると思いますが、なぜcase
コンパイルするのでしょうか? 関数名にはもっと具体的なものがあると思いますが、見つけられませんでした。
関数に名前を付けることはできますdefault()
か? また、C++03 と C++11 では規則が異なりますか?