继续我对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()));发布于 2017-08-28 07:50:29
一个小更正:在range-v3中,valid_expr是一个对象,而不是一个类型:
constexpr struct valid_expr_t { /*...*/ } valid_expr;现在,考虑一下如果您按照建议使用concepts::valid_expr(static_cast<To>(from())),并且To是void,会发生什么。允许static_cast to void,但不允许调用带有void表达式的参数的函数。
https://stackoverflow.com/questions/45909343
复制相似问题