C++范围 - v3 概念::valid_expr 检查,带有尾随", 42"



继续阅读 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()))并且Tovoid会发生什么。允许static_castvoid,但不允许调用带有参数的函数,该参数是void表达式。

相关内容

  • 没有找到相关文章

最新更新