【发布时间】:2018-01-30 11:08:03
【问题描述】:
我有一个这样定义的类:
class ASTConcatenateLiteral : public ASTExpr {
using ASTExpr::ASTExpr;
private:
Type type_ = Type::nothingness(); // Type does not have a default constructor
};
这适用于 Clang。然而,GCC 给了我一条错误消息,让我认为它正在尝试使用默认初始化程序:
错误:没有匹配的函数调用'EmojicodeCompiler::Type::Type()'
如果我用这样的公共构造函数替换using ASTExpr::ASTExpr;(ASTExpr 只提供这个构造函数)
ASTConcatenateLiteral(const SourcePosition &p) : ASTExpr(p) {}
一切正常。
继承的构造函数等效于用户定义的构造函数,其主体为空,成员初始化列表由单个嵌套名称说明符组成,它将所有参数转发给基类构造函数。
那么为什么继承的构造函数不起作用呢?如果继承的构造函数的行为类似于用户定义的构造函数,它应该使用为type_ 提供的值,对吗?根据标准,哪个编译器是正确的?
【问题讨论】:
-
这可以用 g++ 7.2 编译。
-
@Holt Sheesh。难怪我没有设法重现这个问题,如果它只在旧版本中失败。
-
@Holt 我尝试使用 6.2.0。但在那种情况下,我将不得不再次提高 GCC 版本要求......
-
error: no matching function for call to ‘EmojicodeCompiler::Type::Type()’这应该穿在极客 T 恤上。
标签: c++ c++11 gcc clang language-lawyer