Почему не удается создать экземпляр шаблона класса для неиспользуемой функции шаблона члена ⇐ C++
Почему не удается создать экземпляр шаблона класса для неиспользуемой функции шаблона члена
Что здесь не так:
#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 (протестировано внутри компании): ошибка
Однако остается вопрос: почему параметр шаблона по умолчанию для функции, которая никогда не используется, приводит к сбою компиляции?
Что здесь не так:
#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 (протестировано внутри компании): ошибка
Однако остается вопрос: почему параметр шаблона по умолчанию для функции, которая никогда не используется, приводит к сбою компиляции?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение