6

बनाम निम्नलिखित कोड का टुकड़ा पर विचार करें:बेनामी temporaries और वर्ग टेम्पलेट तर्क कटौती जीसीसी बजना

template <typename T> 
struct foo 
{ 
    foo(T) { } 
}; 

int main() 
{ 
    foo{0}; 
} 

जी ++ 7 खुशी से, प्रकार foo की एक अस्थायी वस्तु बनाता है T = int बात का अनुमान लगाना।

error: expected unqualified-id 
    foo{0}; 
    ^

live example on wandbox


यह एक बजना बग है, या वहाँ स्टैंडर्ड कि रोकता में कुछ है:

बजना ++ 5 और 6 कोड को संकलित करने के लिए मना कर दिया अज्ञात temporari के लिए लात मारने से वर्ग टेम्पलेट तर्क कटौती es?

उत्तर

6

बजना बग (#34091)

[dcl.type.class.deduct] से:

एक deduced वर्ग प्रकार के लिए एक प्लेसहोल्डर में भी इस्तेमाल किया जा सकता है [...] या सरल प्रकार-विनिर्देशक के रूप में explicit type conversion (functional notation) में। किसी समर्पित वर्ग प्रकार के लिए प्लेसहोल्डर किसी अन्य संदर्भ में प्रकट नहीं होगा। [उदाहरण:

template<class T> struct container { 
    container(T t) {} 
    template<class Iter> container(Iter beg, Iter end); 
}; 

template<class Iter> 
container(Iter b, Iter e) -> container<typename std::iterator_traits<Iter>::value_type>; 
std::vector<double> v = { /* ... */ }; 

container c(7);       // OK, deduces int for T 
auto d = container(v.begin(), v.end()); // OK, deduces double for T 
container e{5, 6};      // error, int is not an iterator 

- अंत उदाहरण]

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