我們有以下代碼異常規格不兼容的聲明和實現的功能
int main()
{
void f() throw(int);
f();
return 0;
}
void f() { }
GCC和鐺編譯得很好。但是,在標準有這樣一段話:
n3376 15.4/4
如果任何聲明函數有一個異常規範不是一個noexcept規格允許 所有的異常,所有聲明,包括該功能的定義和任何明確的專業化應具有兼容的異常規範。
而對於下面的例子:GCC - 錯誤,鐺 - 警告
void f() throw(int);
int main()
{
f();
return 0;
}
void f() { }
爲什麼有這些片斷的區別?謝謝。
在另一個函數內部聲明的函數是否指向外部同名函數的定義?在另一箇中聲明一個函數是什麼意思? – jogojapan 2013-02-19 05:39:56
@jogojapan,無法找到關於這種情況的標準。但無論如何,這裏沒有未定義的參考。 http://liveworkspace.org/code/3BA8in$0有undef ref。 – ForEveR 2013-02-19 05:41:17
是的,但問題(即使它是一個編譯器問題)與此相關,與異常規範的處理無關。例如,如果你聲明'f'在'main'內部返回'int',但是在'main'之外返回'void',它仍然會被編譯。即使你調用'f'並使用其所謂的返回值。至少在g ++和clang中:http://liveworkspace.org/code/2l5YiJ$1有趣的是,英特爾編譯器發出警告。 – jogojapan 2013-02-19 05:45:05