You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:37:07