10

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

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++
4

1 回答 1

7

我相信标准中的适当措辞如下(n4296, 12.9 Inheriting constructors):

...

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

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

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

(2.3) —显式(12.3.1)的缺失或存在。

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

...

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

于 2017-01-05T22:28:55.050 回答