2017-10-11 23 views
10

Các hàm ảo không thể là constexpr tuy nhiên, khi một hàm ảo hoàn toàn thông qua kế thừa, các trình biên dịch tôi đã thử không phàn nàn về nó.Hàm constexpr ảo hoàn toàn

Dưới đây là một số mẫu mã:

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 
}; 

Tôi đã thử nó với gcc 7.2.0clang 5.0.0.

Các trình biên dịch đó có tuân thủ tiêu chuẩn trong lĩnh vực này hay không hoặc các hàm ảo được cho phép là constexpr?

+3

[Phiên bản này của tiếng kêu vang có vẻ phàn nàn] (http://coliru.stacked-crooked.com/a/a3d1b1ef2348d2c2) – Borgleader

+0

hãy kiểm tra lại clang –

+0

Đúng vậy, tôi đã sai về clang – MaxV37

Trả lời

8

Trình biên dịch có lỗi. Lưu ý rằng điều này đã được sửa trong clang 3.5 rồi, không chắc tại sao bạn không gặp lỗi, bởi vì tôi làm vậy.

Tiêu chuẩn là khá rõ ràng về điều này trong [dcl.constexpr]p3:

Định nghĩa của một hàm constexpr phải đáp ứng các yêu cầu sau:

  • nó không phải ảo;
  • [...]

Nó does't kể doSomething là ngầm virtual hay không. Trong cả hai trường hợp, nó được coi là virtual và do đó vi phạm điểm trên.

Các vấn đề liên quan