2013-01-02 3 views
19

decltypetypeofに関する質問:decltypeとtypeofの違いは?

  • decltypetypeof事業者との間の違いはありますか?
  • typeofはC++ 11では廃止予定ですか?
+16

はtypeof'は、標準ではなかった 'を覚えておいてください。 – GManNickG

+6

もう一つは存在しません:-)また、 'decltype'は非常に一般的な設定で' decltype(x)&& 'のようなものを言うことを可能にする明確で興味深いセマンティクスを持っています。 –

答えて

19

c++にはtypeof演算子がありません。このような機能はほとんどのコンパイラでかなりの期間提供されてきましたが、コンパイラ固有の言語拡張が常にありました。したがって、一般的には2つの動作を比較することは意味がありません。typeof(それが存在する場合でも)の動作はプラットフォームに非常に依存しているためです。

変数/式の型を取得するための標準的な方法があるので、ポータブルでない拡張機能に依存する理由は全くないので、はかなり古いものです。

考慮すべきもう一つは、意味(行動がtypeofのであれば、typeof拡張は、将来的に新しい言語機能を包含するように多くの開発を取得することはできません可能性がある特定のコンパイラのdecltypeと互換性がないということです単にlambdaなどではうまくいかないかもしれません)。現在の状況であるかどうかは分かりませんが、それは別の可能性です。

+1

'typeof'(gcc、EDG、Metroworks)の参照削除セマンティクスがその型のローカル変数を宣言するのに便利だったので、' decltype'だけではそれほど時代遅れではありません。しかし、 'auto'と組み合わされても、今はかなり不要です。既存の実装の違いにより、理想的に名前が付けられた 'typeof'(' alignof'、 'sizeof'で韻を踏む)を使うことができなかったのは残念です。 –

1

タイプは、いくつかのコンパイラベンダー、例えばGCCによって実装されているが、標準化されていない。それはdecltypeで時代遅れになった。

typeofの欠点の良い説明はin this related answerです。

6

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は好ましい選択(sizeofalignofと一致し、かつ、既に拡張で使用される名前)だったが、あなたは、既存の実装との互換性の周りの提案N1478、心配で見ることができるように参照を削除すると、別の名前が付けられました。

"一般的な式の型を問い合わせるためのメカニズムを参照するときは、オペレータ名typeofを使用します.. decltype演算子は、typeofの提案されたバリアントを参照します...コンパイラベンダ(EDG、Metrowerks、GCC) 4節で述べたように、これは変数の型を表現するのに理想的であると思われるが、参照落としのセマンティクスでは、型抜きセマンティクスを正確に表現する仕組みが提供されていない。この提案では、式の型に関する情報を提供する演算子のセマンティクスは、宣言された型を反映しているため、decltypeという名前の演算子を提案します。

J. Jarvi、B. Stroustrup、D. Gregor、J. Siek:Decltype and auto。 N1478/03-0061。

だから、(あなたが参照落下セマンティクスをしたい場合は、それらのコンパイラでtypeof演算の拡張子は、まだ使用している)decltypeが完全typeofを回避することを言うために間違ったのですが、むしろ、typeofが大きく低下していた、それによって不要にプラスautoました可変推論のためにtypeofが使用された場合の使用を参照し、置き換えます。

0

まあ、typeofはGNU C++で使用できる非標準のGNU C拡張です。GCCでは他の言語の機能を(他にもありませんが)使用できるため、実際に比較する必要はありません。

他の非標準的な拡張が他のコンパイラにも存在するかもしれませんが、GCCは最も広く文書化された実装です。

質問に答えるには、それが決して機能ではない場合、それは廃止することはできません。

C++のどちらのメソッドのメリットを比較する場合は、参照を扱っていない限り意味的に違いはありません。ポータブルで規格に準拠しているため、decltypeを使用する必要があります。レガシーコードの場合

3

、私は成功し、次を使用している:

#include <type_traits> 
#define typeof(x) std::remove_reference<decltype((x))>::type 
+0

余分な '()'はなぜですか? 'decltype(x)'と 'decltype((x))'の違いは、通常は余分な '&'だけです。または私は何かを逃していますか? – Yakk

+0

余分なカッコは、パラメータxのシールドされていないコンマに対する防御を目的としていますが、decltypeがマクロの場合にのみ脅威になります。 それらの必要性は、 – user377178

+2

でも可能です。引数として '...'、 '__VA_ARGS__'または' bob 'が必要になるのは、cプリプロセッサによって正しく解析されません。 – Yakk