https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88165

            Bug ID: 88165
           Summary: error: default member initializer for 'A::B::m'
                    required before the end of its enclosing class
           Product: gcc
           Version: 8.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: leanid.chaika at gmail dot com
  Target Milestone: ---

The following compiles with MSVC2017 and not with gcc8.2. This bug was reported
first on stackoverflow
(https://stackoverflow.com/questions/53408962/try-to-understand-compiler-error-message-default-member-initializer-required-be)

minimum code example:
-prog.cc-------------------------
#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.);
}
--------------------------------
compile command:
g++ prog.cc -std=c++17 
--------------------------------
error message:
prog.cc:15:36: error: default member initializer for 'A::B::m' required before
the end of its enclosing class
    void f(double d, const B &b = B{}) {}
                                    ^
prog.cc:12:22: note: defined here
             double m = std::numeric_limits<double>::max();
                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Reply via email to