2017-10-11 12 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.0 और clang 5.0.0 साथ इसे करने की कोशिश:

यहाँ एक नमूना कोड है।

क्या वे संकलक इस संबंध में मानक के अनुरूप नहीं हैं, या निहित वर्चुअल constexpr फ़ंक्शंस की अनुमति है?

+3

[बजना के इस संस्करण में शिकायत करने के लिए लगता है] (http://coliru.stacked-crooked.com/a/a3d1b1ef2348d2c2) – Borgleader

+0

कृपया दोहरी जांच बजना –

+0

यह सही है, मैं बजना – MaxV37

उत्तर

8

कंपाइलर्स में एक बग है। ध्यान दें कि यह पहले से ही क्लैंग 3.5 में तय किया गया है, यह सुनिश्चित नहीं है कि आपको कोई त्रुटि क्यों नहीं मिलती है, क्योंकि मैं करता हूं।

मानक [dcl.constexpr]p3 में इस बारे में बहुत स्पष्ट है:

एक constexpr समारोह निम्न आवश्यकताओं को संतुष्ट करेगा की परिभाषा:

  • यह आभासी नहीं होगा;
  • [...]

यह बात शामिल नहीं है कि क्या doSomething परोक्ष virtual है या नहीं। दोनों मामलों में, इसे virtual माना जाता है, और इसलिए यह उपर्युक्त बिंदु का उल्लंघन करता है।

संबंधित मुद्दे