2017-01-13 4 views
6

私は何とかC++ 11でその属性が導入されたことを忘れていました。今、私は、overridefinalがという特別な意味を持つ識別子として追加され、標準属性ではないと思っています。なぜC++ 11はオーバーライドされ、最終的な属性ではないのですか?

overrideの目的は、コンパイル時のエラーを生成することです。これは多くの標準属性の目的でもあります。彼らはそのコンセプトに合っているかのように感じますが、私が行方不明になっている理由が考えられます。

+0

なぜ「noexcept」は1ではないのですか?宇宙の質問。 –

+0

"これは多くの標準属性の目的でもあります。どれ? –

+0

@GillBates戻り値を持つ式なので? – ygram

答えて

7

彼らはC++ 11のFCDにUS 44コメントに応じて変化してしまったの前に彼らは、かつてあった:

属性が二つのベンダーの両方から続け 異議上で標準化され続けていても本来の 先行技術として引用されているように、バーチャル オーバーライドコントロールを除き、それらと一緒に暮らすことができます。すでに(抜粋)7.6.5に 例に示すように、この結果は、ちょうどひどいです:

ここ
class D [[base_check]] : public B { 
    void some_func [[override]](); 
    virtual void h [[hiding]] (char*); 
}; 

我々は6つのキーワード(voidcharを数えていない)があります:3つの正常 キーワード、および3つの[[decorated]]キーワードを。この醜さについては、すでに のC++ 0xの公開嘲笑があります。これは、 の既存の方法で既に解決されているため、後方互換性に関する懸念があっても、 の言語デザインは、 (例えば、既存のコードでは既に 識別子として使用されている可能性があります。以下)。さらに重要なのは、これは です。 に偽装された属性として悪用されており、この提案が受け入れられたことを明示的に約束しています。 バーチャルコントロール キーワードの属性の使用は、属性構文の悪用が最も重大であり、少なくとも では、属性の使用は、 属性でない構文に置き換えることで修正する必要があります。これらの仮想オーバーライドコントロールは、アノテーションではなく言語 機能です。

それとして、それは にはユーザーIDが表示されない可能文法位置に表示されたときに特別な意味を持つものとして単語を認識し、そのような などのコンテキストキーワードを使用して素敵な名前と、既存のコードと無 競合を持つことが可能です(これは利用されている 5年間と正確に名前のないフィールドで報告 紛争やプログラマの混乱の問題)多数の顧客との実際のフィールド の経験5年以上を持っているC++/CLIで証明 :

class D : public B { 
    void some_func() override; // same meaning as [[override]] - explicit override 
    virtual void h (char*) new; // same meaning as [[hiding]] - a new function, not an override 
}; 
int override = 42; // ok, override is not a reserved keyword 

上記のフォームは実装可能で、実装されており、実用的なフィールド体験の年月が であり、動作します。開発者はそれらを愛する。 かどうかの答えは、この既存の実践または何か他のものに従うことで、 には、フィールドでの経験を持っていない醜い 目新しされた仮想オーバーライド制御のために、現在 [[attributed]]キーワードのより自然な交換が必要であると開発者は、すでに を持っていること嘲笑された。

0

は単にhttp://en.cppreference.com/w/cpp/language/attributesを引用すると:

属性は、GNUおよびIBM言語拡張機能として実装定義言語拡張、属性((...))、マイクロソフトの拡張__declspecための統一標準構文を提供します()など

これは、標準言語キーワードが属性ではないことを明確にしています。

+0

「[[noreturn]]のような他の標準的な属性のように属性として実装されているのではなく、なぜそれらのキーワードがキーワードであるかを質問していると思います。 –

関連する問題