if constexpr 中 requires 子句的问题
Problem with requires clause inside if constexpr
在尝试基于 使用 requires clause
实现 if constexpr
时遇到以下问题:
template<class P>
concept TuplePair = requires(P p) {
requires std::tuple_size<P>::value == 2;
std::get<0>(p);
std::get<1>(p);
};
void print(const auto& p) {
if constexpr( TuplePair<decltype(p)> ) {
std::cout << std::get<0>(p) << ", " << std::get<1>(p) << std::endl;
}
else {
std::cout << "else" << std::endl;
}
}
int main() {
// justifiably prints 'else':
print(std::make_tuple(3, 4, 5));
// prints 'else' even though this is a valid TuplePair:
print(std::make_tuple(1, 2));
}
if constexpr
requires clause
有什么问题?
p
是引用,因此 decltype(p)
是引用类型。对于引用类型 std::tuple_size
将无法正常工作。所以概念检查没有通过。您可以使用 std::remove_cvref_t
来获得普通的引用类型
TuplePair<std::remove_cvref_t<decltype(p)>>
在尝试基于 requires clause
实现 if constexpr
时遇到以下问题:
template<class P>
concept TuplePair = requires(P p) {
requires std::tuple_size<P>::value == 2;
std::get<0>(p);
std::get<1>(p);
};
void print(const auto& p) {
if constexpr( TuplePair<decltype(p)> ) {
std::cout << std::get<0>(p) << ", " << std::get<1>(p) << std::endl;
}
else {
std::cout << "else" << std::endl;
}
}
int main() {
// justifiably prints 'else':
print(std::make_tuple(3, 4, 5));
// prints 'else' even though this is a valid TuplePair:
print(std::make_tuple(1, 2));
}
if constexpr
requires clause
有什么问题?
p
是引用,因此 decltype(p)
是引用类型。对于引用类型 std::tuple_size
将无法正常工作。所以概念检查没有通过。您可以使用 std::remove_cvref_t
来获得普通的引用类型
TuplePair<std::remove_cvref_t<decltype(p)>>