Проблема с концепцией проверки того, что элементы пакета параметров являются либо плавающими, либо двойными.C++

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

Сообщение Anonymous »

Я написал следующий код C++23 и столкнулся с проблемой. В своем коде я определил концепцию проверки того, состоит ли последовательность из типов float и double. Используя эту концепцию, я определил функцию ChTest(). Однако компилятор ведет себя по-разному при использовании предложения require и при его отсутствии.

Код: Выделить всё

#include 
#include 

template 
concept IsFloat = std::is_same_v;

template 
concept IsDouble = std::is_same_v;

constexpr bool isValidSequence()
{
return true;
}

template 
constexpr bool isValidSequence(First, Rest... rest)
{
if constexpr (IsFloat)
return (IsFloat && ...) || isValidSequence(rest...);
else if constexpr (IsDouble)
return (IsDouble && ...);

return false;
}

template 
concept FloatDoubleSequence = isValidSequence(Args{}...);

#if 0 // with requires
template 
requires FloatDoubleSequence
#else // without requires
template 
#endif
void ChTest(Args... args)
{
}

int main()
{
ChTest(1.1f, 2.2f, 3.3f, 4.4, 5.5, 6.6);  // Valid
ChTest(1.1f, 2.2f, 3.3f);                 // Valid
ChTest(1.1, 2.2, 3.3);                    // Valid
ChTest(1.1f, 2.2f, 3.3f, 4.4, 5.5);       // Valid
ChTest(3.3f, 4.4, 5.5f);                  // With requires, the compiler correctly gives an error, but without requires, it does not. It should give an error in both cases.

return 0;
}
Проблема
В приведенном выше коде я определил функцию ChTest() с требованием и без него. Второй звонок, т.е. ChTest(3.3f, 4.4, 5.5f) правильно выдает ошибку при компиляции с использованием требований, но не выдает ошибку без требований. В обоих случаях должна выдаваться ошибка.
Ожидаемое поведение
Компилятор должен выдавать ошибку для недопустимой последовательности в обоих случаях (с наличием или без требуется).
В чем причина такого поведения? Как я могу получить ту же ошибку, не используя require?

Подробнее здесь: https://stackoverflow.com/questions/786 ... r-float-or
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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