2013-02-19 41 views
6

我們有以下代碼異常規格不兼容的聲明和實現的功能

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() { } 

爲什麼有這些片斷的區別?謝謝。

+0

在另一個函數內部聲明的函數是否指向外部同名函數的定義?在另一箇中聲明一個函數是什麼意思? – jogojapan 2013-02-19 05:39:56

+0

@jogojapan,無法找到關於這種情況的標準。但無論如何,這裏沒有未定義的參考。 http://liveworkspace.org/code/3BA8in$0有undef ref。 – ForEveR 2013-02-19 05:41:17

+4

是的,但問題(即使它是一個編譯器問題)與此相關,與異常規範的處理無關。例如,如果你聲明'f'在'main'內部返回'int',但是在'main'之外返回'void',它仍然會被編譯。即使你調用'f'並使用其所謂的返回值。至少在g ++和clang中:http://liveworkspace.org/code/2l5YiJ$1有趣的是,英特爾編譯器發出警告。 – jogojapan 2013-02-19 05:45:05

回答

2

從一個函數的所有聲明和定義必須具有相同的投擲類型在std specifie的n3376 15.4/4。在這裏:

void f() throw(int); 
int main() 
{ 
    f(); 
    return 0; 
} 

void f() { } 

聲明void f() throw(int);和定義void f() { }在全球SCOP。所以它們是衝突的,因爲聲明是針對拋出int的函數,而定義針對沒有拋出規範的函數。

現在,當你把聲明的主要SCOP的定義是不一樣SCOP,在這個SCOP的定義是不知道,所以你可以編譯。

我希望你能理解我的英語,對此表示遺憾。

+0

不是真的,但接受。 Actualy鐺現在處理這種情況,但只有警告:http://melpon.org/wandbox/permlink/z6JcuiyJm7y87PXD – ForEveR 2015-09-05 07:54:04