2

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 は後者をサポートしていませんが、明らかに前者をサポートしており、関数名をdeletenullptr、またはswitch、またはに変更すると、実際に文句を言いcaseます。

GCCでは、これを取得します:

エラー: 'default' の前に unqualified-id が必要です
関数 'int main()' 内:
エラー: ケース ラベルが switch ステートメント内にありません
エラー: '(' トークンの前に ':'が必要です
エラー: ')' トークンの前にプライマリ式が必要です

Clangは私にこれを与えます:

エラー: unqualified-id
void default(){}が期待されます
........^

私は明らかにその名前を変更していますが、VSはこれを受け入れるのが間違っていますか、それとも言語への追加で具体的= defaultに変更されたのでしょうか? = deleteVS がそれをサポートしておらず、それがプログラムの誤りの原因である場合、それが受け入れられる理由がわかります。

仕様でこれを見つけました(C++ 11 § 6.1/2):

case ラベルと default ラベルは、switch ステートメントでのみ発生します。

コロンが後に続くラベルとして使用されていないため、許可されていると主張できると思いますが、なぜcaseコンパイルするのでしょうか? 関数名にはもっと具体的なものがあると思いますが、見つけられませんでした。

関数に名前を付けることはできますdefault()か? また、C++03 と C++11 では規則が異なりますか?

4

2 に答える 2

3

default識別子は、キーワードとして使用するために予約されています。

表 4 に示されている識別子は、 attribute-tokenを除き、キーワードとして使用するために予約されています (つまり、フェーズ 7 では無条件にキーワードとして扱われます)。

表 4 †</sup> には、他のすべてのキーワードの中でも、 が含まれていますdefaultVC++ はattribute-tokendefaultの外側の識別子を受け入れるのは間違っており、関数名はattribute-tokenではありません..

†</sup> C++11 では表 4 ですが、C++98 と 03 では表 3defaultです。

于 2012-12-01T16:36:13.330 に答える
2

それは許可されていません。関数または変数の宣言では、C++ キーワードを使用できません。例外なく。この規則は、すべての C++ 標準で同じです。

于 2012-12-01T16:33:28.800 に答える