模板实参传递问题:std::convertible_to参数对应关系及原因
std::convertible_to参数对应关系解析 1. 表达式{ t++ }的结果对应std::convertible_to的哪个参数?
表达式{ t++ }的结果对应std::convertible_to的第一个模板参数(From),T对应第二个模板参数(To)。
2. 原因分析
在C++概念的后置要求(->语法)中,{ 表达式 }的类型会被推导为目标概念的第一个模板参数,箭头右侧的概念所指定的其余参数则按顺序匹配。具体到这段代码,{ t++ } -> std::convertible_to<T>等价于要求std::convertible_to<decltype((t++)), T>成立,其中decltype((t++))就是表达式t++的实际类型(包含值类别信息)。
3. 为何传入T作为另一参数而非反向?
我们的核心需求是验证**t++的返回值能够转换为原类型T**,这完全契合std::convertible_to<From, To>的语义:From类型的值可以隐式转换为To类型。如果反向传入std::convertible_to<T, decltype((t++))>,语义就变成了T类型可以转换为t++的返回值,这和我们要确保的“后置自增返回值兼容原类型”的需求完全相悖。
4. 权威参考依据
根据C++20标准草案(N4860)的**[expr.requires]**章节:
对于形如
{ E } -> C<A₁, A₂, ..., Aₙ>的后置要求,等价于要求概念C<decltype((E)), A₁, A₂, ..., Aₙ>得到满足。
同时,**[concept.convertible]**章节明确了std::convertible_to<From, To>的定义:
概念
convertible_to<From, To>指定了From类型的表达式可以隐式转换为To类型。
内容的提问来源于stack exchange,提问作者Muhammad

