2016-12-22 13 views
15

C++ में 17 noexcepthas 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> एक अधूरी प्रकार है:

+0

यदि 'अस्वीकरण' अब इस प्रकार का हिस्सा माना जाता है, तो 'शून्य() 'अस्वीकरण'' शून्य() 'से अलग है, इसलिए यह खराब है। जावा के विपरीत, फ़ंक्शन के हस्ताक्षर के हिस्से के रूप में अपवाद विनिर्देशन सहित, कुछ ऐसा था जो मैंने हमेशा सोचा कि सी ++ गलत हो गया है। यह देखने के लिए अच्छा है कि अब इसे ठीक किया जा रहा है। –

+3

व्यवहार यह है कि इसे एक अपूर्ण प्रकार के बारे में शिकायत करनी चाहिए। 'std :: function' आंशिक रूप से 'आर (Args ...)' के लिए विशेष रूप से विशिष्ट है, 'आर (Args ...) noexcept' नहीं। –

+0

@ टी.सी. ठीक है, फिर g ++ 7 द्वारा सही व्यवहार। क्या आप उस टिप्पणी को उत्तर में लिख सकते हैं? –

उत्तर

11

std::function की परिभाषा वर्तमान कार्यशील मसौदे में नहीं बदला है। क्लैंग और जीसीसी ट्रंक दोनों तदनुसार इसका निदान करते हैं।

संबंधित मुद्दे