C++ clang不识别lambda中的基类

C++ clang不识别lambda中的基类,c++,lambda,compiler-errors,clang,derived-class,C++,Lambda,Compiler Errors,Clang,Derived Class,我有以下结构MyStruct,它在构造时调用Foo: struct MyStruct { MyStruct() { Foo<int>(); } template<typename T> void Foo() { []() { struct Base { Base(int n) {} }; struct D

我有以下结构
MyStruct
,它在构造时调用
Foo

struct MyStruct {
    MyStruct() {
        Foo<int>();
    }

    template<typename T>
    void Foo() {
        []() {
            struct Base {
                Base(int n) {}
            };
            struct Derived : Base {
                // using Base=Base; // needs to be uncommented for Apple LLVM version 9.1.0 (clang-902.0.39.2)
                Derived() :
                    Base(0) // problematic line
                {}
            } derived;
        };
    }
};
作为一种解决方法,我尝试在
struct-Derived
(如图所示)中引入
使用Base=Base
,这使得它可以通过XCode编译。(作为旁注:使用相同的解决方法不适用于锁销上的clang 3.6。)

下面是我的问题:

  • 这是一个编译器错误吗?如果是:是否有文件记录
  • 是我的工作程序<代码>使用Base= Base< /Cord>有效的,定义良好的C++(

我不明白为什么lambda函数的函数体应该与非lambda函数的函数体有任何区别。由于您的继承在非lambda函数中是完全有效的,所以您所描述的在我看来像是一个bug。此外,如果添加
static_断言(std::is_base_of::value,“Not base of”)在lambda函数中,编译器很好(使用godbolt,clang3.6,--std=c++1y进行测试)这与您编写的
typedef Base完全相同
和typedef名称相当于不带
typedef
关键字的类型。换句话说,typedef(或using)之后的
Base
与typedef(或using)之前的
Base
完全相同。
explicit
在默认构造函数
explicit-Derived()中做什么?我见过
explicit
用于单参数构造函数,但不用于默认构造函数,我对此很感兴趣(我的Google fu让我失望)。@Eljay See了解有关
explicit
的更多信息。以我为例,它是多余的(实际上是我最初问题的遗留问题)。
error: member initializer 'Base' does not name a non-static data member or base class