プログラミング言語Cの次期仕様C2x(C23)では、式から型情報を取り出す typeof演算子(typeof operator) が追加される。
// C2x const int x = /*...*/; typeof(x) y; // const int型 typeof_unqual(x) z; // int型 int func(int); typeof(func)* pf; // int(*)(int)型
まとめ:
- 2種類のtypeof演算子が追加される。
- typeof演算子は 式(expression) または 型名(type-name) を対象とする。
- C言語の
typeof
!= C++言語のdecltype
typeof(C) vs. decltype(C++)
C言語のtypeof
とC++言語のdecltype
(→id:yohhoy:20200817)とで導出される型が異なる例:
int x; // int // C2x typeof( x ) y0; // int typeof((x)) y1; // int // C++ decltype( x ) z0; // int decltype((x)) z1; // int&(参照型)
C++11 decltype
検討時の提案文書N1607*4でもGCC拡張機能typeof
における参照型の扱いを取り上げ、それとは異なる動きをするキーワードとしてC++へ導入した経緯がある。
3 Design alternatives for typeof
Two main options for the semantics of atypeof
operator have been discussed: either to preserve or to drop references in types.
(snip)
A reference-droppingtypeof
always removes top-level references. Some compiler vendors (EDG, Metrowerks, GCC) provide atypeof
operator as an extension with reference-dropping semantics. This appears to be a reasonable semantics for expressing the type of variables. On the other hand, the reference-dropping semantics fails to provide a mechanism for exactly expressing the return types of generic functions, as demonstrated by Stroustrup. This implies that a reference-droppingtypeof
would cause problems for writers of generic libraries.
(snip)
Therefore, we propose that the operator be nameddecltype
.
関連URL
*1:トップレベルの const, volatile, restrict(→id:yohhoy:20120223), _Atomic の4種類全てが除去される。C言語の _Atomic キーワードには、指定子 _Atomic(T) と 修飾子 _Atomic T の2種類の用法があるが、typeof_unqual は両者を区別せずに除去する。
*2:C++言語仕様には restrict 修飾子は存在しない。またC++のatomic変数はクラステンプレート std::atomic<T> として定義され、C言語のような _Atomic キーワードが存在しない。
*3:https://qiita.com/yohhoy/items/a2ab2900a2bd36c31879
*4:https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1607.pdf