2012-05-31 12 views
10

सार

मैं सी ++ 11 कोड बजना संगत बनाने के साथ संघर्ष कर रहा हूँ और एक मामले में जहां जीसीसी> = 4.6 कोड और बजना> = 3.1 स्वीकार करता है में भाग नहीं करता है। क्लैंग candidate constructor not viable मानता है।बजना मुद्दा: निर्माण समय में निहित जैसे रूपांतरण

विवरण

यहाँ एक उदाहरण नीचे छंटनी की है इस मुद्दे को वर्णन करने के लिए:

#include <utility> 

template <typename...> 
struct T; 

template<> 
struct T<> 
{ 
    typedef T super; 

    constexpr T() { } 

    template <typename... Args> 
    T(Args&&...) { } 

}; 

template <typename Head, typename... Tail> 
struct T<Head, Tail...> : T<Tail...> 
{ 
    typedef T<Tail...> super; 

    Head head; 

    T(Head arg) : super(), head(std::move(arg)) { } 
}; 


struct void_type 
{ 
    constexpr void_type() { } 
    constexpr void_type(const void_type&) { } 
    void_type& operator=(const void_type&) = default; 

    template <typename Arg0, typename... Args> 
    void_type(Arg0&&, Args&&...) { } 
}; 

struct atom { }; 

int main() 
{ 
    atom a; 
    T<void_type> t(a); 

    return 0; 
} 

त्रुटि मैं मिलता है:

ctor-init.cpp:44:18: error: no matching constructor for initialization of 'T<void_type>' 
    T<void_type> t(a); 
       ^~ 
ctor-init.cpp:19:8: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'atom' to 'const T<void_type>' for 1st argument; 
struct T<Head, Tail...> : T<Tail...> 
    ^
ctor-init.cpp:25:5: note: candidate constructor not viable: no known conversion from 'atom' to 'void_type' for 1st argument; 
    T(Head arg) : super(), head(std::move(arg)) { } 
    ^
1 error generated. 

मुझे समझ नहीं आता क्यों बजना कमी के बारे में शिकायत एक रूपांतरण संभावना की वजह से, क्योंकि मुझे लगता है कि यह "पकड़-सब" कन्स्ट्रक्टर काम करना चाहिए:

template <typename Arg0, typename... Args> 
void_type(Arg0&&, Args&&...) { } 

तो त्रुटि के बारे में मैं उलझन में हूँ है:

ctor-init.cpp:25:5: note: candidate constructor not viable: no known conversion from 'atom' to 'void_type' for 1st argument; 
    T(Head arg) : super(), head(std::move(arg)) { } 
    ^

सब के बाद, जीसीसी कोड स्वीकार करता है। क्या यह शायद एक क्लैंग बग है? (मैं एलएलवीएम गिट भंडार से नवीनतम क्लैंग का उपयोग कर रहा हूं।)

+0

@dirkgently: उस नाम के साथ, आप इस छिद्रित उदाहरण के साथ भी मदद करने में सक्षम होना चाहिए। आखिरकार आप जासूस हैं जिन्होंने श्रोडिंगर्स बिल्ली पाया। – LiKao

+1

यदि आप परमाणु से सीधे void_type बनाने का प्रयास करते हैं तो क्या होता है: 'void_type v (a)'? –

+0

@ डेव्स: यह सिर्फ ठीक है। क्या यह आपको एक सुराग देता है क्यों कन्स्ट्रक्टर में अंतर्निहित रूपांतरण विफल रहता है? – mavam

उत्तर

1

वास्तव में, यह एक क्लैंग बग था। यह पता चला कि विविध रचनाकारों को गलती से स्पष्ट के रूप में चिह्नित किया गया है। Fixed in Clang r158040

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