2017-09-22 65 views
0

我想知道爲什麼下面的功能模板專業化不編譯 (由於no return statement in function returning non-void)。功能模板專業化bool返回值

class Boring { 
public: 
    template<typename T> bool eval() const { } 
}; 

template<> inline bool Boring::eval<int>() const { return true; } 

我期望非專業功能模板不會被評估,除非使用。如果返回類型更改爲T*,則以下編譯成功。

int x = 5; 

class Boring { 
public: 
    template<typename T> T* eval() const { } 
}; 

template<> inline int* Boring::eval<int>() const { return &x; } 

回答

0

這兩個程序都是格式良好的。雖然未定義的行爲將在主模塊被實例化並被調用時發生,但這不會使程序格式不正確。但是,您的編譯器會將某些警告視爲錯誤(可能爲-Wall),或者將此特定警告視爲默認錯誤。

+0

我想我的問題來自這樣一個事實,即在T *情況下的主要eval模板將導致相同的錯誤(無效的返回類型),但布爾返回情況導致編譯錯誤。這兩個函數模板都有空體。 –

+0

@JohnKane這是一個實施質量問題。在第二種情況下,由於無法檢測到缺少return語句,請針對您的編譯器提出錯誤。 – Brian