C++ ranges-v3 concepts::valid_expr 检查,尾随 ", 42"

标签 c++ template-meta-programming c++-concepts comma-operator

继续阅读 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())) 会发生什么按照建议和Tovoid .允许static_castvoid , 但不允许调用参数为 void 的函数表达。

关于C++ ranges-v3 concepts::valid_expr 检查,尾随 ", 42",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45909343/

相关文章:

c++ - 如何为 MFC CEdit ON_EN_SETFOCUS 实现事件处理程序?

c++ - 处理轮廓中的像素(OpenCV)?

c++ - 如何使 static_assert 与 SFINAE 配合使用

c++ - 改进折叠功能

c++ - 概念-如何限制积分模板值

c++ - 为什么basic_string_view不限于字符类型?

c++ - qt creator opencv windows cmake错误

C++:cout 语句使我的程序失控?

c++ - 如何在编译时重复连接字符串?

c++ - 在 C++20 中,什么时候应该使用 `iterator_traits<I>::value_type` ,什么时候应该使用 `iter_value_t` ?