"在成员函数之外的封闭类的定义中需要默认成员初始值设定项" - 我的代码是不正确的?

Wal*_*ter 8 c++ inner-classes language-lawyer noexcept c++11

struct foo
{
    struct bar {
        ~bar() {}                // no error w/o this line
    };
    bar *data = nullptr;         // no error w/o this line
    foo() noexcept = default;    // no error w/o this line
};
Run Code Online (Sandbox Code Playgroud)

是的,我知道,还有另一个问题具有完全相同的标题,但是有一个不同的问题(涉及noexcept 运算符而没有嵌套类型).该解决方案建议有(取代的构造foo

    foo() noexcept {}
Run Code Online (Sandbox Code Playgroud)

)改变语义,这里没有必要:这里我们有一个更好的答案(因此问题不是重复).

编译器:Apple LLVM version 9.0.0 (clang-900.0.37),完整的错误信息:

test.cc:44:5: error: default member initializer for 'data' needed within definition of enclosing class 'foo' outside of member functions
    foo() noexcept = default;
    ^
test.cc:41:10: note: default member initializer declared here
    bar* data = nullptr;
         ^
Run Code Online (Sandbox Code Playgroud)

Wal*_*ter 1

通过默认嵌套类的析构函数可以解决该问题

struct foo
{
    struct bar {
        ~bar() = default;        // this fixes it
    };
    bar *data = nullptr;         // no error w/o this line
    foo() noexcept = default;    // no error w/o this line
};
Run Code Online (Sandbox Code Playgroud)

但是,我不清楚为什么/标准是否要求这样做。