Похоже, gcc разрешил вызывать неконстантные родительские методы из константных методов шаблонных классов, если последние не созданы, но прекратили делать это в версии 7.1.0.Приведенный ниже код компилируется с использованием gcc 6.3.0, но gcc 7.1.0 завершается ошибкой с error: no matching function for call to 'B<T>::foo() const'
.
struct A
{
int foo () { return 0; }
};
template<typename T>
struct B: public A
{
int bar() const { return foo(); }
};
int main ()
{
B<int>();
return 0;
}
. Я тестировал разные версии здесь: https://wandbox.org/
Если удалить строкуtemplate<typename T>
, обе версии терпят неудачу с error: passing 'const B' as 'this' argument discards qualifiers [-fpermissive]
Пожалуйста, объясните, почему более ранние версии допускали такой код, а последние версии нет?
UPD: Все версии clang иMSVC я нашел компилировать пример.Так что это не было какой-то специфической особенностью ошибки в более ранних версиях gcc.
UPD: Проблема, очевидно, в том, что более ранние версии не проверяли неинстанцированные методы шаблонных классов.Но теперь они делают.Почему они это сделали?