2016-03-08 15 views
10

は、次のコードを考えてみましょうS<void(int)>エイリアステンプレート、部分的な特殊化および無効なパラメータの型がvoid

さて、次の変更を検討してください。

int main() { 
    S<void(void)> s; // this line compiles 
    Alias<void> alias; // this line does not 
} 

私はそれが言及した上記のものと類似している理由のため、コンパイルすると予想。
ではなく、私はエラーを取得し、それが原因Aliasを含む行のコンパイルされないことは言うまでもない:

In substitution of 'template using Alias = S [with Args = {void}]'

[...]

error: invalid parameter type 'void'

質問は非常に単純です:私はここに逃した何?

答えて

5

[dcl.fct]、強調鉱山から:この場合

A parameter list consisting of a single unnamed parameter of non-dependent type void is equivalent to an empty parameter list. Except for this special case, a parameter shall not have type cvvoid .

Args...依存型パックであるので、voidは存在できません。このアイデアは、[temp.deduct]でノートで繰り返される:void(void)が非依存であるとvoid()と同等であるため、S<void(void)>がそうRet(Args...)パラメータリストでvoidを持っていると推定されることはありません、コンパイル

[ Note: Type deduction may fail for the following reasons:
— [...]
— Attempting to create a function type in which a parameter has a type of void , or in which the return type is a function type or array type.
— [...]
—end note ]

注こと - Args...が空で推測されます。


少なくとも、Alias<>と書くことができるという簡単な回避策があります。

+0

回避策は明らかですが、同じ理由で両方の行のコンパイルに失敗してはいけませんか?また、 'S 'は、パラメータが 'void' *の型を持つ関数型を作成しようとしている(うまくいく)。私が間違っている? – skypjack

+0

@skypjack私が探していたセクションが見つかりました。 'void 'は非依存でなければならない。 – Barry

+0

参考になっていただきありがとうございます。とにかく 'template 構造体S {};'同じ型の問題を抱える依存型でも、 – skypjack

関連する問題