Объявление конструктора шаблона класса не компилируется для C++20, но компилируется для C++17

Я изучаю шаблоны в С++. В частности, я увидел здесь, что у нас может быть следующее объявление для конструктора:

template<typename T>
struct Rational
{
  Rational<T>();  
};

Но приведенный выше фрагмент терпит неудачу для компиляции в C++2a и успешно компилируется для C++17.

Является ли это ошибкой компилятора или есть причина, по которой он не компилируется для C++2a и C++2b. Если есть причина, то какая. Я хочу знать какие пункты (если есть) из стандарта разрешают/запрещают компиляцию следующих примеров. Поскольку я тестировал приведенный выше пример с C++ 17 и C++ 20, поэтому я ищу цитаты только из этих двух стандартных версий.

@bobah В начале моего вопроса я упомянул источник, откуда взят этот пример. И я не думаю, что они допустят эту ошибку или, по крайней мере, скажут нам об ошибке. Пожалуйста, взгляните на данную ссылку? Кроме того, ваше предложение заменить Rational<T>(); на Rational(); кажется бессмысленным, потому что они оба эквивалентны в соответствии с данной ссылкой.

Anoop Rana 23.04.2022 11:17

@bobah Это не ошибка компилятора С++ 17. Допустимо использовать Rational<T>(); в C++17 и эквивалентно написанию Rational(); в соответствии с заданным источник.

Anoop Rana 23.04.2022 11:24
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
4
2
93
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Is this a compiler bug or there is a reason why it doesn't compile for C++2a and C++2b.

Да, это ошибка GCC диагностика, существующая с 2020 года, см. PR 97202.

Цитата из Марек Полачек, одного из участников GCC

This is C++20 DR 2237, disallow simple-template-id in cdtor: see [diff.cpp17.class] p2. Just the diagnostic we give is horrible ;(.

Тем не менее, это ожидаемое поведение с реализацией DR2237, просто диагностика немного плохая.

Так допустимо ли использование Rational<T>(); во всех версиях C++?

Anoop Rana 23.04.2022 12:16

Комментарий 2 в ссылке кажется недействительным, но сообщение об ошибке плохое. Не знаю, где найти ссылки на DR 2237, [diff.cpp17.class]p2.

super 23.04.2022 12:20

@康桓瑋 Значит, это означает, что Rational<T>(); допустимо в C++11, C++14 и C++17, но не в C++20 и новее, верно?

Anoop Rana 23.04.2022 12:28

@Ричард. Из разн.cpp17#класс-2: "Действительный код C++ 2017 может не скомпилироваться в этой версии C++."

康桓瑋 23.04.2022 12:28
Ответ принят как подходящий

Это не ошибка.

Это следствие сдача в стандарте.

Affected subclauses: [class.ctor] and [class.dtor] Change: A simple-template-id is no longer valid as the declarator-id of a constructor or destructor. Rationale: Remove potentially error-prone option for redundancy. Effect on original feature: Valid C++ 2017 code may fail to compile in this revision of C++. For example:

template<class T>
struct A {
  A<T>();           // error: simple-template-id not allowed for constructor
  A(int);           // OK, injected-class-name used
  ~A<T>();          // error: simple-template-id not allowed for destructor
};

Однако существует сообщение об ошибке, который был первоначально закрыт, а затем вновь открыт с целью улучшения диагностического сообщения.

Итак, это означает, что Rational<T>(); допустимо в C++11, C++14 и C++17, но не в C++20 и выше, верно?

Anoop Rana 23.04.2022 12:30

Да, это мое понимание.

super 23.04.2022 12:31

Другие вопросы по теме