关于C++20中std::convertible_to单参数使用的技术疑问
C++20概念中
std::convertible_to单参数使用的解析 问题背景
我在查阅C++ concepts文档时,遇到如下首个示例:
template<typename T> concept Hashable = requires(T a) { { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>; };
该示例可通过GCC C++20编译,文档说明:表达式std::hash<T>{}(a)可编译且其结果可转换为std::size_t。但我查看std::convertible_to的签名为:
template <class From, class To>
它需要两个模板参数,为何示例中仅传入std::size_t一个参数?是文档疏漏还是C++20的概念特性?
补充疑问:概念约束内部是否会默认传入一个隐式参数?
解答
这是C++20标准为概念约束设计的缩写语法,并非文档疏漏。
在requires表达式的箭头约束(-> 后的概念约束)中,标准规定:箭头左侧表达式的类型会被自动作为概念的第一个模板参数传入。也就是说,{ expr } -> Concept<Arg> 等价于 Concept<decltype((expr)), Arg>。
回到示例中,{ std::hash<T>{}(a) } -> std::convertible_to<std::size_t> 会被编译器自动展开为 std::convertible_to<decltype((std::hash<T>{}(a))), std::size_t>,完全匹配std::convertible_to的双参数签名,因此可以正常编译。
针对补充疑问:这种隐式传入第一个参数的行为,仅在requires表达式的箭头约束上下文中生效,是C++20概念特性的一部分,专门用于简化约束书写,避免重复编写decltype((expr))这类冗余代码。
内容的提问来源于stack exchange,提问作者Student4K
相关产品推荐
相关产品推荐

