Конструктор с неверно введенным значением по умолчанию не вызывает ошибок в GCC 7 - PullRequest
0 голосов
/ 11 мая 2018

В следующем коде определение переменной B<int, int>(14); должно быть ошибочным:

#include <iostream>

struct A {
};

template<class T, class R=A>
class B {
public:
    explicit B(const int s, R n = A()) { 
        std::cout << "c\n"; 
    }
};

template <class T, class R=A>
void foo(const int s, R nx = A()) {};

int main() {
    B<int, int>(14);
    // foo<int, int>(14);
    // error: could not convert ‘A()’ from ‘A’ to ‘int’
}

Почему это не приводит к ошибке компиляции?

I compiled theкод с gcc 7.3 и g++ -std=c++17

Когда я компилирую код с gcc 7.3 и g++ -std=c++14, я получаю сообщение об ошибке.

Я думал, что строка использует значение по умолчанию для параметра n в конструкторе B.

Значением по умолчанию n является A(), которое не может быть преобразовано в int.

И я должен получить ошибку компиляции.Но это не тот случай.

Аналогичный случай для функции (как проверено foo) может вызвать ошибку компиляции.

1 Ответ

0 голосов
/ 11 мая 2018

Вы столкнулись с ошибка GCC # 83020 . Clang 6 и GCC 8 (а также GCC 6) корректно отклоняют ваш пример кода, как и GCC 7 в режиме C ++ 14.

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