Try to understand compiler error message: default member initializer required before the end of its enclosing class

后端 未结 1 553
执笔经年
执笔经年 2020-12-01 21:15

I try next code with three compilers (msvc2017, gcc8.2, clang7.0) and msvc2017 works all the way, but gcc and clang not. I want to understand what is wrong with my code, and

相关标签:
1条回答
  • 2020-12-01 21:42

    This is a clang and gcc bug, we have a clang bug report for this: default member initializer for 'm' needed within definition of enclosing class for default argument of function which has the following example:

    #include <limits>
    class A
    {
       public:
          class B
          {
             public:
                explicit B() = default;
                ~B() = default;
    
             private:
                double m = std::numeric_limits<double>::max();
          };
    
       void f(double d, const B &b = B{}) {}
    };
    
    int main()
    {
       A a{};
       a.f(0.);
    }
    

    which produces the following similar diagnostic:

    t.cpp(15,34):  error: default member initializer for 'm' needed within definition of enclosing class 'A' outside of member functions
       void f(double d, const B &b = B{}) {}
                                     ^
    t.cpp(12,20):  note: default member initializer declared here
                double m = std::numeric_limits<double>::max();
                       ^
    

    Richard Smith indicates this is a bug:

    Regarding comment#0: if we want to fix this once-and-for-all, we should use the same technique we use for delayed template parsing: teach Sema to call back into the parser to parse the delayed regions on-demand. Then we would only reject the cases where there's an actual dependency cycle.

    Although does not explain why in details.

    0 讨论(0)
提交回复
热议问题