Унаследованный конструктор, компилируется в clang ++ 3.9, не работает в g ​​++ 7 - PullRequest
0 голосов
/ 03 июля 2018

Этот фрагмент кода

struct Base{};
struct Derived: Base{
    using Base::Base;
};

int main() 
{
    Base b;
    Derived d{b};
}

прекрасно компилируется на clang ++ 3.9 , однако не работает на всех gcc (включая 7) и clangs с версиями меньше 3.9 с ошибкой msg

ошибка: нет подходящей функции для вызова Derived :: Derived () Derived d {b} '.

Соответствует ли код приведенному выше стандарту или нет?

PS: если я закомментирую строку using Base::Base, код больше не будет компилироваться в clang-3.9.

1 Ответ

0 голосов
/ 04 июля 2018

Это CWG 2356 . Похоже, что и gcc, и clang уже реализуют это (clang 4.0+ отвергает его), несмотря на то, что он все еще "предварительно готов" и еще не принят в рабочий проект. даже думал, что он только что был принят в рабочий проект в Рапперсвиле в прошлом месяце через P1114 .

Правило таково:

Конструктор, унаследованный от типа класса C (15.6.3 [class.inhctor.init]), который имеет первый параметр типа «ссылка на cv1 P» (включая такой конструктор создается из шаблона) исключается из набора функций-кандидатов при создании объекта типа cv2 D, если список аргументов имеет ровно один аргумент, а C связан со ссылками на P и P относится к D.

Это исключает конструктор копирования Base из рассмотрения (в нашем случае C и P оба B, а B связан со ссылкой D), поэтому оба компилятора отклоняют ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...