2017-09-06 7 views
20

इस कोड:क्यों {} पहले क्रम में std :: nullptr_t में परिवर्तित किया गया?

#include <iostream> 
#include <vector> 

using namespace std; 

void dump(const std::string& s) { 
    cout << s << endl; 
} 

class T { 
public: 
    T() { 
     dump("default ctor"); 
    } 

    T(std::nullptr_t) { 
     dump("ctor from nullptr_t"); 
    } 

    T(const T&) { 
     dump("copy ctor"); 
    } 

    T& operator=(const T&) { 
     dump("copy operator="); 
     return *this; 
    } 

    T& operator=(std::nullptr_t) { 
     dump("operator=(std::nullptr_t)"); 
     return *this; 
    } 

    T& operator=(const std::vector<int>&) { 
     dump("operator=(vector)"); 
     return *this; 
    } 
}; 

int main() { 
    T t0; 

    t0 = {}; 

    return 0; 
} 

outputs:

default ctor 
operator=(std::nullptr_t) 

क्यों std::nullptr_t साथ operator= चयनित किया गया था?

+5

मुझे लगता है कि '{}' '' std :: nullptr_t' एक मानक रूपांतरण (वास्तव में, पहचान रूपांतरण, [over.ics.list]) है, लेकिन अन्य रूपांतरण उपयोगकर्ता परिभाषित हैं, क्योंकि परिणामस्वरूप उपयोगकर्ता परिभाषित प्रकार। –

+1

आमतौर पर जब मैं एक प्रकार 'टी' देखता हूं तो यह एक टेम्पलेट पैरामीटर है। यह मुझे एक सेकंड के लिए भ्रमित कर दिया। –

उत्तर

18

हम तीन उम्मीदवारों है:

  1. operator=(T const&)
  2. operator=(std::vector<int> const&)
  3. operator=(std::nullptr_t)

दोनों # 1 और # 2 के लिए, {} एक user-defined conversion sequence की ओर जाता है।

हालांकि, # 3, {} के लिए standard conversion sequence है क्योंकि nullptr_t कक्षा प्रकार नहीं है।

चूंकि एक मानक रूपांतरण अनुक्रम better than उपयोगकर्ता परिभाषित रूपांतरण अनुक्रम है, # 3 जीतता है।

+1

तो यदि आप ऐसा करने के लिए 'std :: nullptr_t' नहीं चाहते थे, तो आप अपना स्वयं का प्रकार लिख सकते हैं जो 'std :: nullptr_t' से स्पष्ट रूप से परिवर्तनीय है, जो सभी 3 विकल्प उपयोगकर्ता परिभाषित रूपांतरण अनुक्रमों को बनाएगा, इसलिए यह एक संदिग्ध ओवरलोड – Justin

+0

होगा तो वास्तव में किस प्रकार से {{} 'बनाया गया था? –

+0

@MarkRansom क्या हो रहा है क्या हम मूल्य निर्धारण शुरू कर रहे हैं 'std :: nullptr_t', अगर आप यही पूछ रहे हैं? – Barry

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