15
在C++ 17 noexcept
has 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中,第二個程序的正確行爲是什麼?
如果noexcept現在被認爲是該類型的一部分,那麼void()noexcept與void()不同,因此這是不合格的。與Java不同,不包括異常說明作爲函數簽名的一部分,這是我一直認爲C++出錯的原因。很高興看到這現在正在糾正。 –
行爲是它應該抱怨不完整的類型。 'std :: function'僅部分專用於'R(Args ...)',而不是'R(Args ...)noexcept'。 –
@ T.C。好的,然後通過g ++ 7修正行爲。你能把這個評論寫入一個答案嗎? –