У меня есть класс, определенный следующим образом:
class ASTConcatenateLiteral : public ASTExpr {
using ASTExpr::ASTExpr;
private:
Type type_ = Type::nothingness(); // Type does not have a default constructor
};
Это прекрасно работает с Кланом. GCC, однако, дает мне сообщение об ошибке, которое заставляет меня думать, что он пытается использовать инициализатор по умолчанию:
error: нет соответствующей функции для вызова в 'EmojicodeCompiler:: Type:: Type()
Если я заменил using ASTExpr::ASTExpr;
на публичный конструктор, подобный этому (ASTExpr предоставляет только этот конструктор)
ASTConcatenateLiteral(const SourcePosition &p) : ASTExpr(p) {}
все работает нормально.
Согласно cppreference.com:
Унаследованные конструкторы эквивалентны определяемым пользователем конструкторам с пустым телом и списком инициализаторов членов, состоящим из одного вложенного имени-спецификатора, который пересылает все его аргументы в конструктор базового класса.
Так почему же не работает наследуемый конструктор? Если унаследованный конструктор ведет себя как пользовательские конструкторы, он должен использовать значение, указанное для type_
, правильно? Какой из компиляторов прав в соответствии со стандартом?