क्यों `घोषणापत्र (static_cast <T> (…))` हमेशा `T` नहीं है?


24

निम्नलिखित कोड के लिए, सभी अंतिम पुष्टि गुजरती है:

template<typename T>
constexpr void assert_static_cast_identity() {
    using T_cast = decltype(static_cast<T>(std::declval<T>()));
    static_assert(std::is_same_v<T_cast, T>);
}

int main() {
    assert_static_cast_identity<int>();
    assert_static_cast_identity<int&>();
    assert_static_cast_identity<int&&>();
    // assert_static_cast_identity<int(int)>(); // illegal cast
    assert_static_cast_identity<int (&)(int)>();
    assert_static_cast_identity<int (&&)(int)>(); // static assert fails
}

यह अंतिम दावा क्यों विफल हो रहा है, और static_cast<T>हमेशा नहीं लौट रहा है T?


मुझे लगता है मैं जोड़ देता T_cast i{1};हूं invalid initialization of non-const reference of type 'T_cast' {aka 'int (&)(int)'} from an rvalue of type '<brace-enclosed initializer list>', इसलिए जो भी कारण T_castहै एक के int (&)(int)बजाय int (&&)(int)
केविन

जवाबों:


21

यह परिभाषा में हार्ड कोडित है static_cast:

[expr.static.cast] (जोर मेरा)

1 अभिव्यक्ति static_­cast<T>(v)का परिणाम अभिव्यक्ति vको टाइप करने के लिए परिवर्तित करने का परिणाम है Tयदि Tकार्य प्रकार के लिए एक लवल्यू संदर्भ प्रकार या एक रेवल्यू संदर्भ है, तो परिणाम एक लैवल्यू है ; यदि Tवस्तु प्रकार के लिए एक संदर्भ है, परिणाम एक xvalue है; अन्यथा, परिणाम एक प्रचलन है। static_­cast ऑपरेटर दूर constness डाली नहीं होगी।

decltype अपने ऑपरेंड के मूल्य श्रेणी का सम्मान करता है, और लैवल्यू भावों के लिए एक लैवल्यू संदर्भ बनाता है।

तर्क कार्य के कारण हो सकता है नाम खुद को हमेशा अंतराल रहे हैं, और इसलिए एक फ़ंक्शन प्रकार का एक "जंगली" में प्रकट नहीं हो सकता है। जैसे, उस प्रकार के लिए कास्टिंग शायद बहुत कम समझ में आता है।


यह प्रश्न एक फ़ंक्शन प्रकार के
एरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.