web-dev-qa-db-ja.com

静的キーワードの廃止...これ以上?

C++では、翻訳単位内でstaticキーワードを使用して、シンボル(変数または関数宣言)の可視性に影響を与えることができます。

N3092では、これは廃止されました。

付録D.2[depr.static]
名前空間のスコープでオブジェクトを宣言する場合、staticキーワードの使用は非推奨です(3.3.6を参照)。

N3225では、これは削除されました。

私が見つけることができる記事のみ はやや非公式です。

しかし、Cとの互換性(およびCプログラムをC++としてコンパイルする機能)のために、非推奨はうっとうしいことを強調しています。ただし、C++としてCプログラムを直接コンパイルすることは、すでにイライラする経験になる可能性があるため、検討が必要かどうかはわかりません。

なぜ変更されたのか誰にもわかりますか?

83
Matthieu M.

C++ Standard Core Language Defect Reports and Accepted Issues、Revision 94 under1012非推奨のstatic `の注意点:

7.3.1.1 [namespace.unnamed]は、名前のない名前空間が優れた代替手段を提供するため、名前空間のスコープで変数を宣言するためのstaticキーワードの使用は推奨されないと述べていますが、近い将来、この機能が削除される可能性は低い。

基本的に、staticの廃止は本当に意味がないと言っています。 C++から削除されることはありません。また、内部リンケージを使用して関数またはオブジェクトを宣言するだけの場合は、名前のない名前空間で必要な定型コードが必要ないため、依然として便利です。

私はあなたの質問に答えようとしますが、それは古い質問ですが、あまり重要ではありません(それ自体はそれ自体ではあまり重要ではありません)、非常に良い答えを受け取りました既に。私が答えたい理由は、言語が既存の言語に基づいている場合の標準的な進化と言語設計の基本的な問題に関連しているためです:言語機能を非推奨、削除、または互換性のない方法で変更する必要があるのはいつですか?

C++では、翻訳単位内でstaticキーワードを使用して、シンボル(変数または関数宣言)の可視性に影響を与えることができます。

実際のリンケージ。

N3092では、これは廃止されました。

非推奨は以下を示します。

  • intentは、将来いくつかの機能を削除します。これは、非推奨の機能が次の標準リビジョンで削除されることを意味するものではなく、「すぐに」削除される必要がある、またはまったく削除される必要があるという意味でもありません。また、非推奨ではない機能は、次の標準リビジョンで削除される可能性があります。
  • その使用を阻止するための正式な試み

後者のポイントは重要です。あなたのプログラムが次の標準までに、時には静かに破られないという正式な約束はありませんが、委員会は「合理的な」コードを破らないようにするべきです。廃止は、プログラマーに何らかの機能に依存するのは理にかなっていないことを伝える必要があります。

しかし、Cとの互換性(およびCプログラムをC++としてコンパイルする機能)のために、非推奨は煩わしいことを強調しています。ただし、C++としてCプログラムを直接コンパイルすることは、すでにイライラする経験になる可能性があるため、検討が必要かどうかはわかりません。

C/C++共通サブセット、特にヘッダーファイルを保持することは非常に重要です。もちろん、staticグローバル宣言は、内部リンケージを持つシンボルの宣言であり、ヘッダーファイルではあまり役に立ちません。

しかし、問題は単にCとの互換性ではなく、既存のC++との互換性です。staticグローバル宣言を使用する既存の有効なC++プログラムがたくさんあります。 明確に定義された言語機能を意図された方法で使用しているため、このコードは正式に正当であるだけでなく健全です。

何かをするための「より良い方法」(ある人によると)があるからといって、古い方法で書かれたプログラムを「悪い」または「不合理な」ものにしないわけではありません。グローバルスコープのオブジェクトと関数の宣言でstaticキーワードを使用する機能は、CコミュニティとC++コミュニティの両方でよく理解されており、ほとんどの場合正しく使用されています。

同様に、Cスタイルキャストをdoubleから_static_cast<double>_に変更するつもりはありません。「Cスタイルキャストが悪い」という理由だけで、_static_cast<double>_はゼロ情報とゼロ安全性を追加します。

何かをするための新しい方法が発明されたときはいつでも、すべてのプログラマーが既存の明確に定義された作業コードを書き直すことを急ぐだろうという考えはただの狂気です。 継承されたCのさと問題をすべて削除したい場合は、C++を変更せずに、新しいプログラミング言語を発明します。staticの1つの使用を半分削除しますC++をCの見苦しいものにすることはほとんどありません。

コードの変更には正当化が必要であり、「古いものは悪い」ということはコード変更の正当化にはなりません。

言語の変更を壊すには、非常に強力な正当化が必要です。言語をごくわずかに単純化することは、重大な変更を正当化するものではありません。

staticが悪い理由は非常に弱いだけであり、オブジェクトと関数の両方の宣言が非推奨にならない理由も明確ではありません。異なる扱いを与えると、C++がより簡単またはより直交しなくなります。

それで、本当に、それは悲しい話です。実際的な結果が原因ではなく、実際的な結果はまったくありませんでした。しかし、それはISO委員会からの常識の明らかな欠如を示しているからです。

28
curiousguy

廃止されるかどうかにかかわらず、この言語機能を削除すると、既存のコードが破損し、ユーザーを困らせることになります。

静的な廃止の全体は、「匿名の名前空間は静的よりも優れています」および「参照は優れたポインタ」のラインに沿った希望的観測にすぎません。笑。

12