继续阅读 ranges-v3 库,我意识到所有关于模板类型有效表达式的检查都有一个尾部 ", 42"表达式,我想知道这样做的目的是什么。例如:
namespace concepts {
constexpr struct valid_expr
{
template<typename... T>
void operator()(T&&...) const;
};
}
struct ExplicitlyConvertibleTo
{
template<typename From, typename To>
auto requires_(From (&from)()) -> decltype(
concepts::valid_expr(
((void) static_cast<To>(from()), 42)
));
};
我理解该实现的一些要点,例如强制使用逗号运算符的内括号、避免逗号运算符重载的 void-casting 等,但为什么不简单地编写类似的东西呢?
concepts::valid_expr(static_cast<To>(from()));
最佳答案
一个小的更正:在范围-v3,valid_expr
是对象而不是类型:
constexpr struct valid_expr_t { /*...*/ } valid_expr;
现在,考虑如果使用 concepts::valid_expr(static_cast<To>(from()))
会发生什么按照建议和To
是void
.允许static_cast
至 void
, 但不允许调用参数为 void
的函数表达。
关于C++ ranges-v3 concepts::valid_expr 检查,尾随 ", 42",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45909343/