继承一个显式构造函数(Intel C++)

10

在使用 using 继承基类的构造函数时,Intel C++ 编译器(版本 16.0.3.207 build 20160415)似乎会丢失 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++

这肯定是一个bug。继承的构造函数只是通过“using”指令公开,因此应该与基类中的调用完全相同。 - Argenet
除了显式构造函数的定义外,我找到的唯一一件事是:“如果using-declaration命名一个构造函数(3.4.3.1),它会在出现using-declaration的类中隐式声明一组构造函数(12.9)。”就是这样。我没有看到任何明确的(双关语不是故意的)表明哪种行为是正确的。 - Sam Varshavchik
1个回答

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

...

构造函数的特征包括:

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

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

(2.3) — 是否显式声明(12.3.1)。

对于候选继承构造函数集合中的每个非模板构造函数,除了没有参数或只有一个参数的复制/移动构造函数之外,都会隐式声明具有相同构造函数特征的构造函数,除非在使用声明所在的完整类中有具有相同签名的用户声明构造函数,或者该构造函数是该类的默认、复制或移动构造函数。

...

所以很可能这是Intel C++编译器的一个错误。

N4296是C++17的草案。N4140几乎完全符合当前的标准。在N4140中,这个部分有一个(2.4)点。 - M.M
@M.M 你是什么意思? - haelix
@haelix,就是我说的那样...你觉得哪里不清楚呢? - M.M
@M.M 在我看来,你好像在暗示点(2.4)显著地改变了回答问题的答案,但没有引用它,这让我感到困惑。不过也可能不是这样。 - haelix
@haelix 不是的,这只是证明 N4296 与 N4140 的不同之处,我的评论与将 n4296 视为标准的声明有关。 - M.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接