关于std::is_convertible是否检查临时对象创建的技术疑问
关于std::forward旧实现与std::is_convertible的误解澄清
首先明确n2951文档中第5版std::forward实现的语境:它讨论的是完美转发场景下,将源参数(类型U)转换为目标类型T时,是否会因转换动作额外创建临时对象来承载转发结果——这里的“临时对象”指的是为了完成转发而复制/移动源参数产生的临时,而非转换过程中内部生成的临时值。
针对你提到的两个例子:
- int转float的隐式转换:当
std::is_convertible<int, float>为true时,转换确实会生成float临时值,但这是转换的目标结果本身(如果T是float类型,你本来就需要这个值),并非“因转发转换额外创建的临时”。而如果T是float&,std::is_convertible<int, float&>会返回false,这种转换本来就不被允许,自然不存在创建临时的问题。 - 用户定义转换序列:比如类A可以隐式转换为类B,当
std::is_convertible<A, B>为true时,转换会生成B的临时对象,但同样,这是转换的目标结果(若T是B类型),而非转发过程中额外复制源对象产生的临时。如果T是B&,除非A的转换能生成左值(比如转换函数返回B&),否则std::is_convertible<A, B&>为false,这种转换不会被该forward版本允许。
- int转float的隐式转换:当
你推理的核心偏差在于:把“转换过程中生成的目标临时值”和n2951中提到的“因转换创建的临时对象”混为一谈。后者特指为了完成转发而对源参数进行复制/移动所产生的临时,而前者是转换到目标类型本身所需的结果,不属于文档中所指的“需要避免的临时对象”。
内容的提问来源于stack exchange,提问作者Anton Tretyakov
相关产品推荐
相关产品推荐

