2017-01-05 2 views
9

компилятор Intel C++ (версия 16.0.3.207 сборки 20160415), кажется, уронить явно спецификатора, когда конструктор базового класса наследуются с использованием . Это ошибка?Наследование явного конструктора (Intel C++)

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

Это, безусловно, должно быть ошибкой. Унаследованные конструкторы просто отображаются с помощью директивы «using», поэтому он должен быть правильным тем же вызовом, что и в базовом классе. – Argenet

+0

Единственное, что я нашел, помимо определения того, что является явным конструктором: «Если декларация using объявляет конструктор (3.4.3.1), она неявно объявляет набор конструкторов в классе, в котором появляется декларация использования (12.9) «Все. Я не вижу ничего явного (каламбур не предназначен), который предполагает, что одно или другое поведение является правильным. –

ответ

6

Я считаю, что соответствующая формулировка из стандарта состоит в следующем (n4296, 12,9 Наследование Конструкторы):

...

Конструктор характеристики конструктора или шаблон конструктора:

(2.1) - список параметров шаблона (14.1), если любой,

(2,2) - параметр типа-лист (8.3.5), и

(2,3) - отсутствие или наличие явного (12.3.1).

Для каждого конструктора нешаблонного в наборе кандидатов унаследованных, отличных от конструктора, не имеющего параметров или конструктор для копирования/перемещения, имеющий один параметр конструкторов, конструктор является неявно объявленный с тех же конструктора характеристик , если нет конструктора с объявлением, с той же сигнатурой, в , полный класс, в котором появляется декларация использования, или конструктор будет конструктором по умолчанию, копией или перемещением для этого класса .

...

Так, скорее всего, это ошибка в компилятора Intel C++.

+0

N4296 - черновик C++ 17. N4140 почти точно соответствует существующему стандарту. В N4140 есть точка (2.4) в этом разделе –

Смежные вопросы