У меня есть следующая структура 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 ++?