Почему gcc начал проверять неинстанцированные методы шаблонных классов в v. 7.1? - PullRequest
0 голосов
/ 22 сентября 2019

Похоже, 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: Проблема, очевидно, в том, что более ранние версии не проверяли неинстанцированные методы шаблонных классов.Но теперь они делают.Почему они это сделали?

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