decltype
とに関する2つの質問typeof
:
decltype
とtypeof
演算子の間に違いはありますか?typeof
C ++ 11では廃止されますか?
typeof
に演算子はありませんc++
。そのような機能がほとんどのコンパイラによってかなり長い間提供されてきたことは事実ですが、それは常にコンパイラ固有の言語拡張でした。typeof
したがって、 (存在する場合でも)の動作はプラットフォームに非常に依存するため、2つの動作を一般的に比較しても意味がありません。
変数/式の型を取得する標準的な方法があるので、移植性のない拡張機能に依存する理由は実際にはありません。したがって、それはかなり時代遅れだと思います。
考慮すべきもう1つのことは、動作が特定のコンパイラとtypeof
互換性がない場合、拡張機能が将来的に新しい言語機能を包含するように開発されない可能性があることです(つまり、ラムダなどでは機能しない可能性があります) )。現在のところそうであるかどうかはわかりませんが、それは明らかな可能性です。decltype
typeof
2つの違いはdecltype
、情報の一部として参照を常に保持するのに対し、そうでtypeof
ない場合があることです。それで...
int a = 1;
int& ra = a;
typeof(a) b = 1; // int
typeof(ra) b2 = 1; // int
decltype(a) b3; // int
decltype(ra) b4 = a; // reference to int
名前は(ととtypeof
一致し、拡張機能ですでに使用されている名前と一致する)好ましい選択でしたが、提案N1478に見られるように、参照を削除する既存の実装との互換性に関する懸念から、明確な名前が付けられました。sizeof
alignof
「一般に式の型をクエリするメカニズムを参照するときは、演算子名typeofを使用します。decltype演算子はtypeofの提案されたバリアントを参照します。...一部のコンパイラベンダー(EDG、Metrowerks、GCC)はtypeof演算子を提供しますセクション4で説明したように、これは変数の型を表現するのに理想的であるように見えますが、参照ドロップのセマンティクスは、ジェネリックの戻り型を正確に表現するメカニズムを提供できません。関数...この提案では、式の型の情報を提供する演算子のセマンティクスは、宣言された型を反映します。したがって、演算子をdecltypeという名前にすることを提案します。」
J. Jarvi、B。Stroustrup、D。Gregor、J。Siek:Decltypeとauto。N1478/03-0061。
したがって、decltype
完全に省略されたと言うのは誤りtypeof
です(参照ドロップのセマンティクスが必要な場合は、それらのコンパイラのtypeof拡張機能が引き続き使用されます)が、むしろ、参照を削除し、変数に使用された場所を置き換えるtypeof
plusによって大幅に省略されました。推論。auto
typeof
レガシーコードの場合、私は次のものをうまく使用しています。
#include <type_traits>
#define typeof(x) std::remove_reference<decltype((x))>::type
typeofは標準化されていませんが、GCCなどのいくつかのコンパイラベンダーによって実装されています。decltypeで廃止されました。
typeofの欠点についての良い説明は、この関連する回答にあります。
ええと、typeof
GNCは他の言語の機能を別の言語で使用できるので(常にではありませんが)、GNU C++で使用できる非標準のGNUC拡張機能です。したがって、実際には比較しないでください。
もちろん、他のコンパイラには他の非標準の拡張機能が存在する可能性がありますが、GCCは間違いなく最も広く文書化された実装です。
質問に答えるために:それが機能ではなかった場合、それは時代遅れになることはできません。
C ++でどちらかの方法のメリットを比較したい場合は、参照を扱っていない限り、意味的に違いはありません。decltype
持ち運び可能で規格に準拠しているので使用してください。