Почему не удается создать экземпляр шаблона класса для неиспользуемой функции шаблона членаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему не удается создать экземпляр шаблона класса для неиспользуемой функции шаблона члена

Сообщение Anonymous »


Что здесь не так:

#include структура А; шаблон структура Б { template недействительный f1() {} }; шаблон структура С {}; // Введите здесь свой код или загрузите пример. интервал основной() { // Следование не удалось Б б; // Можно использовать это: // b.f1(); // Это соответствует С с; вернуть 0; } /* Включено оно или нет, не имеет значения структура А {}; */ Я пробовал это здесь: https://godbolt.org/z/NkL44s с разными компиляторами:
[*]x86-64 gcc 9.2: компилируется [*]x86-64 gcc (магистраль): сбой [*]x86-64 clang 6.0.0: компилируется [*]x86-64 clang 7.0.0 и более поздние версии: сбой [*]x64 msvc v19.22: компилируется [*]x64 msvc v19.23 (протестировано внутри компании): ошибка
Так почему же более поздние составители отвергают это? При создании экземпляра B неясно, в какой форме будет использоваться f1 и будет ли он использоваться вообще. Так почему же компилятор на это жалуется? Не следует ли проверять функцию шаблона члена f1 только в том случае, если она действительно используется?

Изменить:
Как упоминалось в комментариях, я допустил непреднамеренную ошибку в приведенном выше коде: std::enable_if должен был быть std::enable_if_t, как в этой исправленной игровой площадке: https:// godbolt.org/z/cyuB3d

Это меняет представление о том, что компиляторы передают этот код без ошибок:
[*]gcc: ошибка [*]clang: неудачно [*]x64 msvc v19.22: компилируется [*]x64 msvc v19.23 (протестировано внутри компании): ошибка
Однако остается вопрос: почему параметр шаблона по умолчанию для функции, которая никогда не используется, приводит к сбою компиляции?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»