2016-12-22 77 views
15

在C++ 17 noexcepthas been added to the type system與noexcept功能:的std ::在C++ 17

void r1(void (*f)() noexcept) { f(); } 
void foo() { throw 1; } 

int main() 
{ 
    r1(foo); 
} 

GCC的最新版本,並在鐺C++ 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>的奇怪錯誤。

在C++ 17中,第二個程序的正確行爲是什麼?

+0

如果noexcept現在被認爲是該類型的一部分,那麼void()noexcept與void()不同,因此這是不合格的。與Java不同,不包括異常說明作爲函數簽名的一部分,這是我一直認爲C++出錯的原因。很高興看到這現在正在糾正。 –

+3

行爲是它應該抱怨不完整的類型。 'std :: function'僅部分專用於'R(Args ...)',而不是'R(Args ...)noexcept'。 –

+0

@ T.C。好的,然後通過g ++ 7修正行爲。你能把這個評論寫入一個答案嗎? –

回答

11

std::function的定義在當前的工作草案沒有改變:

template<class T> 
class function; // not defined 

template<class R, class... ArgTypes> 
class function<R(ArgTypes...)> { 
    /* ... */ 
}; 

由於void() noexcept不匹配部分特,std::function<void() noexcept>是一個不完整的類型。 Clang和GCC幹線都相應地診斷出這種情況。