2017-09-01 18 views
12

मानक, std::optional<T> की कॉपी-निर्माता के अनुसार:टीडी नहीं होने पर स्ट्रॉड :: वैकल्पिक का स्थान-निर्माणकर्ता क्यों नहीं हटाया जाता है?

... के रूप में नष्ट जब तक is_copy_constructible_v<T>true है परिभाषित किया जाएगा।

लेकिन std::optional<T> की चाल-निर्माता:

... अधिभार संकल्प में भाग नहीं होगा जब तक कि is_move_constructible_v<T>true है।

जैसा कि मैंने understand deleted constructors, नहीं-को हटाने std::optional<T> की चाल-निर्माता के प्रयोजन के कोड इस तरह की अनुमति के लिए होगा:

std::optional<X> o1; 
std::optional<X> o2(std::move(o1)); 

... कुछ रूपांतरण अनुक्रम पर निर्भर काम करने के लिए - o2 होगा A के ऑब्जेक्ट द्वारा निर्मित किया गया है जिसे std::optional<X>&& का उपयोग करके बनाया गया है (यदि मैं गलत हूं तो मुझे सही करें)।

लेकिन std::optional के संभावित निर्माताओं के बारे में, मैं एक कठिन समय एक ही है कि इस प्रयोग के मामले से मेल खा सकते पता लगाना है ...

क्यों std::optional<T> की चाल-निर्माता बस नहीं हटा दी जाती है अगर T है स्थानांतरित नहीं हो सकता है?

उत्तर

11

स्पष्ट रूप से हटाने के लिए इसका मतलब है कि यह एक्स-मूल्यों के लिए सबसे अच्छा मैच होगा, और इस तरह बजाय एक संकलन समय त्रुटि हो, कॉपी-निर्माता उन मामलों ले जा।

पूर्व:

#include <utility> 

struct X 
{ 
    X() = default; 
    X(const X&) = default; 
    X(X&&) = delete; 
}; 

int main() 
{ 
    X a; 
    X b(std::move(a)); 
} 

कुछ इस तरह का परिणाम देगा:

'X::X(X &&)': attempting to reference a deleted function 

स्पष्ट रूप से नष्ट कर दिया समारोह अभी भी अधिभार संकल्प में भाग लेने, और सबसे अच्छा मैच हो सकता है। उदाहरण के लिए कुछ रूपांतरण अक्षम करने के लिए यह उपयोगी हो सकता है, ।

+0

तो यह केवल 'एक्स' मानों से 'वैकल्पिक' के निर्माण की अनुमति देने के लिए है जब 'टी' कॉपी करने योग्य है लेकिन चलने योग्य नहीं है? – Holt

+0

@ होल्ट: बिल्कुल। – sp2danny

+0

यदि टी टी नहीं चल रहा है तो रचनात्मक को ओवरलोड रिज़ॉल्यूशन से बाहर करने के लिए कैसे घोषित किया जाना चाहिए? '= डिफ़ॉल्ट' के रूप में? –

4

समिति वास्तव में प्रतिलिपि-लेकिन-चलने वाले घृणाओं की परवाह नहीं करती है। देखें, उदाहरण के लिए, LWG issue 2768 की चर्चा, जिसमें "पैथोलॉजिकल" जैसे प्रकार और "पागलपन" के रूप में इसका समर्थन करने के पहले प्रयास की विशेषता थी। जैसे, LWG issue 2766 - -

सामान्य रूप में सामान के इस प्रकार के लिए डिफ़ॉल्ट शब्दों जब तक कि वहाँ जाल कॉल (जो कभी कभी उचित है के लिए कुछ विशेष कारण है "अधिभार संकल्प में भाग लेने नहीं करेगा", है, लेकिन अवांछनीय दुष्प्रभाव इस तरह का कारण बनता है कर सकते हैं LWG issue 2993) के रूप में। विशेष सदस्यों की प्रतिलिपि बनाने के लिए, जो अवधारणाओं से पहले नहीं किया जा सकता है, इसलिए "हटाए गए के रूप में परिभाषित" का उपयोग किया जाना था। विशेष सदस्यों को स्थानांतरित करने के लिए, "हटाए गए के रूप में परिभाषित" ओटीओएच पर्याप्त सटीक नहीं है, क्योंकि "स्पष्ट रूप से हटाए गए कदम" और "डिफ़ॉल्ट रूप से हटाए गए डिफ़ॉल्ट रूप से परिभाषित किया गया है" के बीच बहुत बड़ा अंतर है: बाद में ओवरलोड रिज़ॉल्यूशन में भाग नहीं लेता है।

LWG issue 2958 की चर्चा भी देखें।

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