2016-03-08 7 views
10

Aşağıdaki kod göz geçersizleĢeceği parametre türü: Bu, iyi çalışırad şablonu, kısmi uzmanlık ve

template<typename F> 
struct S; 

template<typename Ret, typename... Args> 
struct S<Ret(Args...)> { }; 

template<typename... Args> 
using Alias = S<void(Args...)>; 

int main() { 
    S<void(int)> s; 
    Alias<int> alias; 
} 

ve beklendiği gibi S ve Alias başlık aynı tip altında tanımlar içeren bir ilgili hattı hem de S<void(int)>.

Şimdi, aşağıdaki değişiklikleri göz önünde bulundurun:

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

Ben yukarıda sayılanlar benzer nedenlerle, bu derlemeye bekleniyor.

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

[...]

error: invalid parameter type 'void'

soru oldukça basittir: O, bunun nedeni Alias karıştığı hattının derleme değil söylemeye gerek yok
yerine hatası alıyorum burada ne cevapsız? vurgu mayın, [dcl.fct] Gönderen

cevap

5

: Bu durumda

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... yüzden void orada izin verilmeyen bir bağımlı tip paketidir. Bu fikir [temp.deduct] bir notta tekrarlanır: void(void) olmayan bağımlıdır ve void() eşdeğerdir çünkü S<void(void)> yüzden Ret(Args...) parametre listesinde void olması sonucuna asla, derler

[ 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 ]

Not o - Args... boş olarak çıkarılmıştır.


En azından sadece Alias<> yazabilir ki basit bir çözüm bulunmaktadır.

+0

Bu geçici çözüm açıktır, ancak her iki satırı da aynı nedenle derlemek başarısız mıdır? Ayrıca, "", bir parametrenin bir "void" * tipine sahip olduğu bir işlev türü oluşturmak için (iyi, başarılı) deneyen bir kesintiye yol açar. Yanlış mıyım? – skypjack

+0

@skypjack Aradığım bölümü buldum. 'Boş' bağımlı değildir. – Barry

+0

Referans için teşekkür ederiz. Her neyse, ayrıca '' Args'''de de 'typename Ret', typename ... Args> struct S {}; 'aynı sorundan muzdarip bağımlı bir tür? – skypjack