10

インテル C++ コンパイラ (バージョン 16.0.3.207 ビルド 20160415)は、基本クラスのコンストラクターがusingで継承されている場合、明示的な指定子をドロップするようです。これはバグですか?

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)の有無。

パラメーターを持たないコンストラクターまたは単一のパラメーターを持つコピー/移動コンストラクターを除く、継承されたコンストラクターの候補セット内の各非テンプレート コンストラクターについて、コンストラクターは同じコンストラクター特性で暗黙的に宣言 されます。 using-declaration が表示される完全なクラス内の同じ署名またはコンストラクターがそのクラスのデフォルト、コピー、または移動コンストラクターになります。

...

したがって、インテル C++ コンパイラーのバグである可能性が最も高いです。

于 2017-01-05T22:28:55.050 に答える