दोनों जीसीसी 5.0 और बजना 3.6 निम्न उदाहरण में typename
कीवर्ड की आवश्यकता होती है:क्या फेंकने या अभिव्यक्ति को कभी भी निर्भर किया जा सकता है?
template<typename T>
struct B
{
typedef int Type;
};
template<int n>
struct A
{
typedef typename B<decltype(throw (int*)n)>::Type Throw;
typedef typename B<decltype(delete (int*)n)>::Type Delete;
};
यह सी ++ 11 मानक में निम्नलिखित शब्दों द्वारा कवर किया जाता:
[छोड़कर]/2
एक फेंक-अभिव्यक्ति प्रकार शून्य है।
[expr.delete]/1
संकार्य प्रकार आपत्ति उठाने का एक सूचक है, या एक वर्ग प्रकार आपत्ति उठाने का एक सूचक के लिए एक एकल गैर स्पष्ट रूपांतरण समारोह होने प्रकार होगा। परिणाम शून्य शून्य है।
तो मुझे लगता है कि decltype
दोनों मामलों में void
उत्पन्न करता है।
[expr.const]/2
सशर्त अभिव्यक्ति एक कोर निरंतर अभिव्यक्ति है जब तक कि यह एक संभावित का मूल्यांकन उपसूचक
एक नई अभिव्यक्ति के रूप में निम्न में से एक शामिल है
एक थ्रो-अभिव्यक्ति
इससे पता चलता है कि throw
या delete
शामिल एक अभिव्यक्ति निरंतर अभिव्यक्ति नहीं हो सकती है।
[temp.dep.type]/8
एक प्रकार निर्भर है अगर यह
एक साधारण-टेम्पलेट-आईडी, जिसमें या तो टेम्पलेट का नाम टेम्पलेट पैरामीटर है या है टेम्पलेट के किसी भी तर्क एक आश्रित प्रकार या एक अभिव्यक्ति है कि प्रकार पर निर्भर या मूल्य पर निर्भर
decltype(expression)
, जहां अभिव्यक्ति टाइप-depende है द्वारा सूचित किया जाता है NT
तो B<decltype(..)>
ही अगर अभिव्यक्ति टाइप पर निर्भर है निर्भर है।
[temp.dep।expr] निम्न रूपों में से/4
भाव टाइप पर निर्भर कभी नहीं किया है (क्योंकि अभिव्यक्ति के प्रकार निर्भर नहीं किया जा सकता):
delete cast-expression throw assignment-expression
यह पता चलता है कि न तो अभिव्यक्ति प्रकार पर निर्भर हो सकता है ।
जीसीसी हैं और दोनों गलत बजना?
मुझे नहीं लगता कि [temp.dep.constexpr]/p1 के बारे में आपकी तर्क सही है। एक 'reinterpret_cast' निरंतर अभिव्यक्ति में प्रकट नहीं हो सकता है, लेकिन [temp.dep.constexpr]/p3 स्पष्ट रूप से निर्दिष्ट करता है कि 'reinterpret_cast' से जुड़ी अभिव्यक्ति संभवतः मूल्य-निर्भर हो सकती है। –
'decltype (..) 'एक अभिव्यक्ति नहीं है। तो आपको [temp.dep.type]/9.8 की भी आवश्यकता है। पैराग्राफ को केवल 'decltype (अभिव्यक्ति)' में अभिव्यक्ति की आवश्यकता होती है, जो * प्रकार-निर्भर * नहीं है, जो 'फेंक' और 'नया' के लिए अच्छी तरह से निर्दिष्ट है। – dyp
@dyp हां! यह निर्णायक लगता है। – willj