Curiously recurring template pattern (CRTP) with static constexpr in Clang

前端 未结 2 659
轮回少年
轮回少年 2021-02-15 04:11

Consider my simple example below:

#include 

template 
class Base
{
public:
    static constexpr int y = T::x;
};

class Derive         


        
2条回答
  •  面向向阳花
    2021-02-15 04:44

    As linked in the comments, Initializing a static constexpr data member of the base class by using a static constexpr data member of the derived class suggests that clang behaviour is standard conformant up to C++14 here. Starting with Clang 3.9, your code compiles successfully with -std=c++1z. An easy possible workaround is to use constexpr functions instead of values:

    #include 
    
    template 
    class Base
    {
    public:
        static constexpr int y() {return T::x();}
    };
    
    class Derived : public Base
    {
    public:
        static constexpr int x() {return 5;}
    };
    
    int main()
    {
        std::cout << Derived::y() << std::endl;
    }
    

提交回复
热议问题