C++ में 17 noexcept
has been added to the type system में noexcept साथ समारोह:std :: सी ++ 17
void r1(void (*f)() noexcept) { f(); }
void foo() { throw 1; }
int main()
{
r1(foo);
}
जीसीसी के नवीनतम संस्करण और में बजना सी ++ 17 मोड कॉल को अस्वीकार r1(foo)
क्योंकि void (*)()
नहीं किया जा सकता स्पष्ट रूप से void (*)() noexcept
में परिवर्तित हो गया।
लेकिन बजाय std::function
साथ:
#include <functional>
void r2(std::function<void() noexcept> f) { f(); }
void foo() { throw 1; }
int main()
{
r2(foo);
}
बजना कार्यक्रम, जाहिरा तौर पर noexcept
विनिर्देशक अनदेखी स्वीकार करता है; और g ++ std::function<void() noexcept>
के बारे में एक अजीब त्रुटि देता है।
सी ++ 17 में इस दूसरे कार्यक्रम के लिए सही व्यवहार क्या है? आंशिक विशेषज्ञता से मेल नहीं खाता
template<class T>
class function; // not defined
template<class R, class... ArgTypes>
class function<R(ArgTypes...)> {
/* ... */
};
void() noexcept
के बाद से std::function<void() noexcept>
एक अधूरी प्रकार है:
यदि 'अस्वीकरण' अब इस प्रकार का हिस्सा माना जाता है, तो 'शून्य() 'अस्वीकरण'' शून्य() 'से अलग है, इसलिए यह खराब है। जावा के विपरीत, फ़ंक्शन के हस्ताक्षर के हिस्से के रूप में अपवाद विनिर्देशन सहित, कुछ ऐसा था जो मैंने हमेशा सोचा कि सी ++ गलत हो गया है। यह देखने के लिए अच्छा है कि अब इसे ठीक किया जा रहा है। –
व्यवहार यह है कि इसे एक अपूर्ण प्रकार के बारे में शिकायत करनी चाहिए। 'std :: function' आंशिक रूप से 'आर (Args ...)' के लिए विशेष रूप से विशिष्ट है, 'आर (Args ...) noexcept' नहीं। –
@ टी.सी. ठीक है, फिर g ++ 7 द्वारा सही व्यवहार। क्या आप उस टिप्पणी को उत्तर में लिख सकते हैं? –