лязг не распознает базовый класс в лямбде - PullRequest
0 голосов
/ 29 августа 2018

У меня есть следующая структура MyStruct, которая вызывает Foo<int> при создании:

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;
        };
    }
};

Я пытался скомпилировать это с помощью clang (через godbolt , параметры командной строки --std=c++1y):

  • 3.6: error: type 'Base' is not a direct or virtual base of 'Derived' (см. problematic line в коде выше)
  • 3.7 и новее: компилирует (с предупреждением о неиспользованных выражениях)

Так что я ожидал, что с более новыми версиями это должно быть в порядке. Однако, когда я попытался скомпилировать его на Mac, используя XCode9 (который в соответствии с этим использует clang 4.0 (clang --version дает Apple LLVM version 9.1.0 (clang-902.0.39.2))), я получаю сообщение об ошибке из той же строки, что и выданная clang 3.6:

error: member initializer 'Base' does not name a non-static data member or base class

В качестве обходного пути я попытался ввести using Base=Base в struct Derived (как указано), что сделало его компиляцией через XCode. (Как примечание: использование того же обходного пути не помогло clang 3.6 на godbolt.)

Итак, вот мои вопросы:

  • Это ошибка компилятора? Если да: это где-то задокументировано?
  • Является ли мой обходной путь using Base=Base действительным, четко определенным C ++?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...