2017-04-26 112 views
5

我試着寫在基類中的純虛函數,我給它的身體定義附近如代碼以下所示的它,因爲我知道我應該得到一個編譯錯誤,但是,一切都正常工作。 C++ 17中有新的東西嗎? (我使用視覺工作室2017)C++ 17中的純虛函數體?

class Base { 
public: 
virtual void virtual_func() { std::cout << "This a virtual function from BASE" << std::endl; }; 
virtual void pure_func() = 0 { std::cout << "This a PURE virtual function from BASE" << std::endl; }; 
}; 

由於

+0

「我知道我應該得到的編譯錯誤」 - 爲什麼?實現純虛函數是完全合法的。 –

+2

該標準不允許這樣做,但是VS(或者更確切地說,微軟的編譯器)可以。爲了符合,您需要將聲明中的定義分開。 –

+0

@尼爾·巴特沃斯我不這麼認爲。它不能在C++ 14下編譯。 http://ideone.com/EISKsp – javaLover

回答

4

純虛擬不能與一個定義一起使用。這在C++ 11是真的,並在C++ 14:

10.4/2: ...
[注:函數聲明不能​​同時提供純的說明符 和定義 - 注完] [實施例:

struct C { 
virtual void f() = 0 { }; // ill-formed 
}; 

相同的聲明(第13.4/2此時)仍然是正確的C++ 17(N4659)。

所以,如果你的編譯器接受這段代碼,它肯定是一個bug(gcc 7.1 doesesn't

+0

耶,你是對舊手,AFAIR。 +1 – snr

+1

僅供參考,我向Microsoft報告了此錯誤:https://developercommunity.visualstudio.com/content/problem/187888/msvc-incorrectly-allows-pure-virtual-function-defi.html –