Код: Выделить всё
#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