2017-10-11 73 views
10

虛擬函數不能是constexpr但是,當函數通過繼承隱式虛擬時,我試過的編譯器不會抱怨它。隱式虛擬constexpr函數

下面是一個示例代碼:

class A 
{ 
    virtual void doSomething() {} 
}; 

class B : public A 
{ 
    constexpr void doSomething() override {} // implicitly virtual constexpr 
              // but no compilation error 
}; 

class C : public A 
{ 
    virtual constexpr void doSomething() override {} // explicitly virtual constexpr 
                // compilation error 
}; 

我與gcc 7.2.0clang 5.0.0嘗試過。

那些編譯器在這方面不符合標準嗎?或者是隱式虛擬的constexpr函數允許嗎?

+3

[這鏗鏘的版本似乎抱怨(http://coliru.stacked-crooked.com/a/a3d1b1ef2348d2c2) – Borgleader

+0

請仔細檢查鐺 –

+0

這是正確的,我錯鐺 – MaxV37

回答

8

編譯器有一個錯誤。請注意,這已經在clang 3.5中修復了,不知道爲什麼你沒有得到一個錯誤,因爲我這樣做。

的標準是非常清楚的瞭解這[dcl.constexpr]p3

一個constexpr功能應滿足下列要求的定義:

  • 不得是虛擬的;
  • [...]

這件事簡化版,doSomething是否隱含virtual與否。在這兩種情況下,它被認爲是virtual,所以它違反了上述觀點。