using
C++11 では、次のように型エイリアスを記述できるようになりましたtypedef
。
typedef int MyInt;
私の理解では、これは次と同等です:
using MyInt = int;
そして、その新しい構文は、「テンプレート typedef」を表現する方法を求める取り組みから生まれました。
template< class T > using MyType = AnotherType< T, MyAllocatorType >;
しかし、最初の 2 つの非テンプレートの例では、標準に他の微妙な違いがあるのでしょうか? たとえば、typedef
は「弱い」方法でエイリアス化を行います。つまり、新しい型は作成されず、新しい名前のみが作成されます (名前間の変換は暗黙的に行われます)。
同じですか、using
それとも新しいタイプを生成しますか? 違いはありますか?
ベストアンサー1
これらは標準から見ると同等です(強調は筆者による)(7.1.3.2):
typedef-name は、alias-declaration によって導入することもできます。using キーワードに続く識別子は typedef-name になり、識別子に続くオプションの attribute-specifier-seq はその typedef-name に関連します。typedef指定子によって導入された場合と同じセマンティクスを持ちます。特に、新しい型を定義するものではなく、type-id に出現してはなりません。