2012-05-10 2 views
4

私は型と初期値で動作するいくつかのマクロを持っています。初期値vInivTypeにキャストする必要があります(vIniはいつもvTypeに変換可能ですが、同じ種類の場合もあります)。 vIniも空である可能性があります。その場合は、vTypeを初期化しないか、デフォルトで初期化する必要があります。 reultはテンプレート関数に渡されます。要するにC++ 11で `someType()`で初期化できない一時ファイルはどれですか?

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

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

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

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

(スペースとポインタを持つ組み込み型に加えて)失敗するケースは他にありますか?

+0

明らかに、 'void()'ですが、正確な構文よりも 'void'オブジェクトを持つことはできません。 – MSalters

+0

http://stackoverflow.com/questions/4669131/how-to-check-if-a-template-argument-is-default-constructibleの重複の可能性もあります。 http://en.cppreference。com/w/cpp/types/is_default_constructible –

+0

@ChristopherCreutzig:これは私の言う限りではこの質問に関するものではありません。これは実際に型自体についてではなく、型の名前付けの仕方です(したがって、 "typedefで回避できます")。確かにその偽装された偽装に対する答えは、この質問に全く答えません。 –

答えて

5

短い(やや簡略化された)答えは、 "単純型指定子以外は何も失敗する"という答えです。

5.2.3/1は言う:

単純型 - 特異的ER(7.1.6.2)または型名 - 特異的ER(14.6)は括弧式リスト構築物によって に従っ式リストを指定して指定された 型の値。

シンプルな型指定子は、タイプごとに1つの単語の名前(必要に応じてプラススコープのためのいくつかの::もの、および/またはテンプレート引数自体はシンプルな型指定子である必要はありません)か、のいずれかになりますa decltype発現。可能性は7.1.6.2にリストされている。

unsigned intおよびint*は、のではありません。どの複合型指定子も失敗するので、cv-qualification、配列型、関数型、ポインタへのポインタやメンバへのポインタを含むポインタ型はすべて型定義が必要です。

unsigned charlong doubleなどのマルチワードタイプの識別子も除外されています。あなたの最初の例では、unsignedunsigned intの代わりに機能します。

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

最後に、この制限を超えると、タイプは実際には式リストから構成可能または変換可能でなければなりません。たとえば、この構文または他の構文を使用して、一時的な関数型を作成することはできません。

+0

驚くべきことに、テンプレートの複合型はうまくいきます: 'std :: vector ()' _simple-template-id_は_simple-type-specifier_ – MSalters

+1

です。人々はしばしば、そのような使用のために別名またはを作成します。つまり、 'alias :: type()' – Puppy

+0

@DeadMG :うん、それは 'declspec'を含む私のものよりも優れています。 –

関連する問題