【问题标题】:Inheriting an explicit constructor (Intel C++)继承显式构造函数(英特尔 C++)
【发布时间】:2017-05-20 14:35:53
【问题描述】:

英特尔 C++ 编译器(版本 16.0.3.207 Build 20160415)似乎在使用 using 继承基类的构造函数时删除了 explicit 说明符。这是一个错误吗?

struct B
{
    explicit B(int) { }
};

struct D : B
{
    using B::B;
};

B b = 1; // Not OK, fine
D d = 1; // Not OK with Microsoft C++ and GCC, but OK with Intel C++

【问题讨论】:

  • 这当然应该是一个错误。继承的构造函数只是使用“using”指令公开,因此它应该与基类中的调用相同。
  • 我发现的唯一一件事,除了显式构造函数的定义是:“如果使用声明命名构造函数(3.4.3.1),它会在类中隐式声明一组构造函数使用声明出现(12.9)“就是这样。我没有看到任何明确的(双关语不是有意的)表明一种或另一种行为是正确的。

标签: c++ c++11 using-declaration icc explicit-constructor


【解决方案1】:

我认为标准中的适当措辞如下(n4296,12.9 继承构造函数):

...

构造函数或构造函数模板的构造函数特征

(2.1) — 模板参数列表 (14.1),如果有的话,

(2.2) — 参数类型列表 (8.3.5),以及

(2.3) — 不存在或存在明确的 (12.3.1)。

对于继承的候选集中的每个非模板构造函数 除了没有参数的构造函数之外的构造函数或 具有单个参数的复制/移动构造函数,构造函数是 使用相同的构造函数特征隐式声明 除非用户声明的构造函数具有相同的签名 出现 using-declaration 的完整类或 构造函数将是它的默认、复制或移动构造函数 类。

...

所以很可能这是英特尔 C++ 编译器中的一个错误。

【讨论】:

  • N4296 是 C++17 草案。 N4140 几乎完全是当前标准。在 N4140 中有一个 (2.4) 点在这部分
  • @M.M 你是什么意思?
  • @haelix 正是我所说的......你发现什么不清楚?
  • @M.M 在我看来,您似乎在暗示 (2.4) 点正在显着改变问题的答案,但没有引用它,这让我感到疑惑。但也许不是。
  • @haelix 不,这只是 N4296 与 N4140 不同的证据,我的评论与 n4296 作为标准的说法有关
猜你喜欢
  • 2012-08-13
  • 1970-01-01
  • 2018-10-10
  • 2019-01-21
  • 2012-11-14
  • 2021-06-24
  • 2015-03-24
  • 2014-08-21
  • 2017-08-09
相关资源
最近更新 更多