继续阅读 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)
));
};
我理解该实现的一些要点,例如强制使用逗号运算符的内括号,避免逗号运算符重载的空转换等,但为什么不简单地写一些类似的东西呢?
concepts::valid_expr(static_cast<To>(from()));
一个小的更正:在 range-v3 中,valid_expr
是一个对象而不是一个类型:
constexpr struct valid_expr_t { /*...*/ } valid_expr;
现在,考虑一下如果您按照建议使用concepts::valid_expr(static_cast<To>(from()))
并且To
void
会发生什么。允许static_cast
void
,但不允许调用带有参数的函数,该参数是void
表达式。