std::is_error_code_enum को इस प्रकार वर्णित किया गया है:

यदि T एक त्रुटि कोड गणना है, तो यह टेम्पलेट सदस्य को स्थिर मान समान सत्य प्रदान करता है।

std::errc को इस प्रकार वर्णित किया गया है:

स्कोप्ड एन्यूमरेशन std::errc पोर्टेबल एरर कंडीशन के मानों को परिभाषित करता है

निश्चित रूप से, std::is_error_code_enum<std::errc>::value true होना चाहिए? फिर भी मेरे लिए यह झूठा है। क्या यह जानबूझकर है?


यह मायने रखता है, क्योंकि इसके बिना, std::errc से std::error_code में निहित रूपांतरण मौजूद नहीं है।

2
Eric 26 जुलाई 2018, 22:21

3 जवाब

सबसे बढ़िया उत्तर

std::errc त्रुटि शर्तों का एक समूह है। इसका मत

std::is_error_condition_enum<T>::value;

true होगा। चूंकि यह त्रुटि कोड की गणना नहीं है

std::is_error_code_enum<T>::value;

होना चाहिए, और है, false

1
NathanOliver 26 जुलाई 2018, 23:31
बहुत भ्रमित करने वाला कि कैसे std::errc एक त्रुटि स्थिति है लेकिन std::io_errc एक त्रुटि कोड है
 – 
Eric
26 जुलाई 2018, 22:43
हाँ, नामकरण सबसे बड़ा नहीं है।
 – 
NathanOliver
26 जुलाई 2018, 22:44
1
मुझे यकीन नहीं है कि मुझे यह जवाब पसंद है। std::error_code के तीसरे कंस्ट्रक्टर का विवरण लें: "एरर कोड एनम ई से एरर कोड बनाता है। *this = make_error_code(e) के बराबर। ओवरलोड ओवरलोड रिज़ॉल्यूशन में तभी भाग लेता है जब std::is_error_code_enum<ErrorCodeEnum>::value == true।" इसका अर्थ यह है कि std::is_error_code_enum<T>::value == true make_error_code(T), और एक std::make_error_code(std::errc) है।
 – 
LRFLEW
17 जिंदा 2019, 10:23
वे 'error_code' से मेल खाने के लिए इसे 'error_cond' नाम दे सकते थे
 – 
smoothware
28 फरवरी 2019, 20:21

[system_error.syn]/1:

is_error_code_enum और is_error_condition_enum को प्रोग्राम-परिभाषित प्रकारों के लिए विशेषीकृत किया जा सकता है ताकि यह इंगित किया जा सके कि ऐसे प्रकार क्रमशः वर्ग error_code और वर्ग error_condition स्वचालित रूपांतरण के लिए पात्र हैं।

Is_error_condition_enum<>::value मान true std::errc के लिए है:

template<> struct is_error_condition_enum<errc> : true_type {};
1
Swordfish 26 जुलाई 2018, 22:35

std::error_code कंस्ट्रक्टर और असाइनमेंट ऑपरेटर को std::errc से सक्षम करने के लिए हमें स्पष्ट रूप से यह कहना होगा कि std::is_error_code_enum<std::errc> को सही लौटना चाहिए। अन्यथा कंस्ट्रक्टर और असाइनमेंट ऑपरेटर अक्षम हो जाएगा।

#include <iostream>
#include <system_error>

// Enable error_code(errc) and error_code = errc
template <> struct std::is_error_code_enum<std::errc>
    : std::true_type {};

int main() {
    std::error_code inv_arg1(std::errc::invalid_argument);
    std::error_code inv_arg2;
    inv_arg2 = std::errc::invalid_argument;
    std::cout << inv_arg1 << std::endl;
    std::cout << inv_arg2 << std::endl;
    return 0;
}

अधिक विवरण system_error शीर्षलेख

-1
x4444 23 पद 2020, 04:00
हालांकि यह वास्तव में काम करेगा, मुझे संदेह है कि मानक द्वारा "अनुमति" stdlib प्रकार के साथ stdlib टेम्पलेट्स की विशेषज्ञता है, जिससे यह एक बुरा विचार है।
 – 
Eric
23 पद 2020, 04:26