Is_nothrow_constructible के gcc के कार्यान्वयन में static_cast की आवश्यकता क्यों है?


11

जीसीसी के कार्यान्वयन से लिया गया type_traitsक्यों static_castयहाँ की आवश्यकता है?

template <typename _Tp, typename... _Args>
struct __is_nt_constructible_impl
    : public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))> {};

template <typename _Tp, typename _Arg>
struct __is_nt_constructible_impl<_Tp, _Arg>
    : public integral_constant<bool,
                               // Why is `static_cast` needed here?
                               noexcept(static_cast<_Tp>(declval<_Arg>()))> {};

यह असंगतता अजीब लगती है
लाइटनेस दौड़ ऑर्बिट

4
आपको संबंधित लिब्स्टेक + मेलिंग लिस्ट पर इस तरह के सवाल पूछने चाहिए
ऑर्बिट में

जवाबों:


12

एक प्रकार एक तर्क सूची से रचनात्मक नहीं है अगर आविष्कार किया चर घोषणा

T t(declval<Args>()...);

किया जाएगा अच्छी तरह से गठित किया जाता है और अपवाद नहीं फेंक करने के लिए जाना । बहुवचन तर्क मामले में यह समान है (modulo noexcept destructibility, LWG 2116 देखें ) अच्छी तरह से गठन और nothrow के प्रकार रूपांतरण अभिव्यक्ति के लिए

T(declval<Args>()...)

हालांकि एकल तर्क मामले में अभिव्यक्ति T(declval<Args>())को कास्ट-एक्सप्रेशन के रूप में माना जाता है , जो आह्वान कर सकता है const_castऔरreinterpret_cast ; static_castघोषणा फॉर्म के समतुल्य उपयोग को पुनर्स्थापित करता है।

एक ठोस उदाहरण के रूप में , प्रकारों पर विचार करें:

struct D;
struct B { operator D&&() const; };
struct D : B {};

यहाँ एक static_castसे B constकरने के लिए D&&रूपांतरण ऑपरेटर, लेकिन एक डाली अभिव्यक्ति कर सकते हैं रूपांतरण ऑपरेटर बाईपास का उपयोग करना चाहिए और इतने noexcept है। इसलिए static_castचूक करना गलत परिणाम देगा is_nothrow_constructible<D&&, B const>


तो static_castजरूरत है ताकि अभिव्यक्ति हमेशा की तरह व्यवहार किया जाता है direct initializationके बजाय के रूप में cast expression?
जोओ पाइरेस

1
@ JoãoPires हाँ, यह सही है। यह अभी भी मानक के द्वारा आवश्यक नहीं है क्योंकि noexceptऑपरेटर के उपयोग से एक घोषणा के noexcept का परीक्षण करना संभव नहीं है , लेकिन यह बहुत करीब है।
२१:२

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