В следующем коде определение переменной 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
) может вызвать ошибку компиляции.