2016-03-08 16 views
10

निम्नलिखित कोड पर विचार करें:उर्फ ​​टेम्पलेट, आंशिक विशेषज्ञता और अवैध पैरामीटर प्रकार शून्य

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; 
} 

यह ठीक है, काम करता अपेक्षा के अनुरूप है और दोनों S और Alias हुड एक ही प्रकार के तहत परिभाषित शामिल एक को शामिल लाइन S<void(int)>

अब, निम्न परिवर्तन पर विचार करें:

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

मैं, यह संकलन करने की उम्मीद कारण है कि लोगों का उल्लेख ऊपर से मिलते-जुलते।

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

[...]

error: invalid parameter type 'void'

सवाल बहुत सरल है::
यह कह रही है कि यह Alias को शामिल लाइन की वजह से संकलन नहीं है बिना चला जाता है, बजाय मैं त्रुटि मिलती है क्या मैं यहाँ याद किया?

उत्तर

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] में एक नोट में दोहराया है:

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

ध्यान दें कि S<void(void)> संकलित के बाद से void(void) गैर निर्भर है और void() के बराबर है, इसलिए Ret(Args...) पैरामीटर सूची में void के लिए निष्कर्ष निकाला कभी नहीं किया गया है - यह Args... खाली के साथ घटाया गया है।


कम से कम उस में एक सरल तरीके को आप सिर्फ Alias<> लिख सकते है।

+0

कामकाज स्पष्ट है, लेकिन क्या यह उसी कारण से दोनों पंक्तियों को संकलित करने में विफल नहीं होना चाहिए? इसके अलावा 'एस 'एक कटौती की ओर जाता है जो कोशिश कर रहा है (अच्छी तरह से, सफल) * एक फ़ंक्शन प्रकार बनाएं जिसमें पैरामीटर के पास' शून्य '* है। क्या मै गलत हु? – skypjack

+0

@skypjack बस मुझे वह अनुभाग मिला जो मैं ढूंढ रहा था। 'शून्य' को गैर-निर्भर होना चाहिए। – Barry

+0

संदर्भ के लिए धन्यवाद। वैसे भी, 'टेम्पलेट struct S {}; 'एक आश्रित प्रकार जो एक ही समस्या से पीड़ित होना चाहिए' में 'Args' भी नहीं है? – skypjack

संबंधित मुद्दे