web-dev-qa-db-ja.com

C ++の型エイリアスは、構文で「typedef」ではなく「using」を使用するのはなぜですか?

明らかに、型エイリアスとテンプレート化された型エイリアスは、テンプレートをサポートするためのtypedefおよびtypedefの拡張と意味的に同等です。 Word usingの最初の構文拡張といくつかの構文拡張にtypedefを使用する代わりに、typedefキーワードを使用した新しい構文が作成されたのはなぜですか。

注:これは、「使用とtypedefの違い」の質問のクローンではありません。 usingには、typedefsのファミリーを定義する利点があることがわかっています。私が尋ねているのは、標準の人々がこの拡張機能にusingキーワードの代わりにtypedefキーワードを使用することに決めた理由です。これは、言語に混乱を加えるだけのようです。

36
tohava

あなたが提案することは、実際に2002年に文書で提案されました N1406 Herb Sutter。たとえば、次のように記述できます。

template<typename T> typedef X<T,int> Xi; 

これは後にガブリエル・ドス・レイスとマット・マーカスによって N1449 で改訂されました。 using構文を採用し、次のことに注意してください。

「typedefテンプレート」という用語を特に避け、混乱を避けるために「using」と「=」のペアを含む新しい構文を導入することに注意してください。ここでは、型を定義せず、テンプレートパラメータを含むtype-id(つまり、式)の抽象化。

彼らはまた述べている:

構文に関する2つのストローポーリングが行われました。 「=」構文を支持して、大多数がtypedefテンプレート構文を避けることに投票しました。 2回目の投票では、「エイリアス」のような単語や、この提案の草案バージョンのようなキーワードの欠如に対して、「使用する」キーワードに対する強い選好が示されました。キーワードを使用する動機は、上記で簡単に説明した非テンプレートエイリアシングの方向と互換性のある構文を使用したいという要望に一部起因しています。

この構文は、最終提案で採用されました N2258 Gabriel Dos ReisとBjarne Stroustrupによって。

30

Bjarne Stroustrupusingを拡張する代わりにtypedefを導入した理由について説明しています。

キーワードus​​ingは、「名前とそれに続く参照」の線形表記を取得するために使用されます。従来の複雑なtypedefソリューションを試してみましたが、あまりわかりにくい構文に落ち着くまで、完全で一貫したソリューションを得ることができませんでした。

彼はまた、通常のtypedefに対してもこの構文が好きだと主張しています。

テンプレートとの関連で重要であることに加えて、タイプエイリアスは、通常のタイプエイリアスの別の(そしてIMOより良い)構文としても使用できます。

using PF = void (*)(double);

彼はここで非常に正しい、これは非常にきれいなようです。対照的に、typedefは名前が真ん中のどこかにあると非常に複雑になります。

typedef void(*PF)(double);

より詳細な提案からの explaination (4ページを参照)は次のとおりです。

論文[4]で行われているように、キーワードtypedefを(再)使用して、テンプレートエイリアスを導入することが推奨されています。

template<class T>
typedef std::vector<T,MyAllocator<T>> Vec;

この表記法には、タイプエイリアスを導入することが既に知られているキーワードを使用するという利点があります。ただし、いくつかの欠点も表示されます。エイリアスが型ではなくテンプレートを指定するコンテキストで、type-nameのエイリアスを導入することが知られているキーワードの使用の混乱。 Vecnot型のエイリアスであり、typedef-nameには使用しないでください。名前Vecはファミリーの名前std::vector<*,MyAllocator<*>>-アスタリスクは、タイプ名のプレースホルダーです。したがって、「typedef」構文は提案しません。

template<class T>
using Vec = std::vector<T,MyAllocator<T>>;

次のように読み取り/解釈できます:これからは、Vect<T>の同義語としてstd::vector<T,MyAllocator<T>>。そのように読めば、エイリアシングの新しい構文は合理的であるように思えます。

そこで彼は基本的に2つのポイントをここに持っています:

  1. usingテンプレートは型ではなく型のファミリーになるため、typedefは「間違っています」
  2. usingはほとんど英語の文章として読むことができます
43
gexicide