4

型と初期値を操作するマクロがいくつかあります。初期値vIniをにキャストする必要がありますvType(vIniは常に に変換可能でvType、同じ型の場合もあります)。vIniも空である可能性があり、その場合は初期化されてvTypeいないか、デフォルトで初期化されている必要があります。結果はテンプレート化された関数に渡されます。

要するに、

template<typename T> void foo(const T& o);

foo(vType(vIni));
foo(vType());

コンパイルする必要があります。

私はすでにそれを発見したfoo(unsigned int())foo(int*())、コンパイルしないことを発見しましたが、typedef で回避できます。

失敗する他のケース (スペースとポインターを含む組み込み型以外) は何ですか?

4

1 に答える 1

5

短い(少し単純化しすぎた)答えは、「単純な型指定子以外では失敗する」です。

5.2.3/1 言います:

simple-type-specifier ( 7.1.6.2 ) またはtypename-specifier (14.6) の後に括弧で囲まれた式リストが続くと、式リストから指定された型の値が構築されます。

simple-type-specifierは、型の1 語の名前 (必要に応じ::て、スコープ用のいくつかの要素、および/またはそれ自体が単純な型指定子である必要のないテンプレート引数) またはdecltype式のいずれかです。可能性は 7.1.6.2 に記載されています。

unsigned int単純型指定子ではありint*ません。複合型指定子はすべて失敗するため、cv 修飾、配列型、関数型、関数へのポインターとメンバーへのポインターを含むポインター型にはすべて typedef が必要です。

unsigned charまた、 、 などの複数単語の型識別子も除外されますlong double。最初の例でunsignedは、 の代わりに機能しunsigned intます。

typename-specifierは、 が前に付いた型でtypenameあり、従属名がデータ メンバーやメンバー関数ではなく、実際に型であることを主張するためにテンプレートで使用されます。

最後に、もちろん、この制限を乗り越えたら、型は実際に構築可能またはexpression-listから変換可能でなければなりません。したがって、たとえば、この構文または他の構文を使用して一時的な関数型を作成することはできません。

于 2012-05-10T12:21:59.203 に答える