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

C++标准-用户定义-标准转换序列示例求证及规范正确性疑问

C++隐式转换序列:标准转换→用户定义转换→标准转换的合理性分析

规范定义

C++规范明确隐式转换序列的组成顺序为:

  • 零个或一个标准转换序列;
  • 零个或一个用户定义转换;
  • 零个或一个标准转换序列(仅当使用了用户定义转换时)。

常见的隐式转换序列分为两类:

  1. 标准转换序列 → 用户定义转换
  2. 用户定义转换 → 标准转换序列

核心疑问:是否存在「标准转换→用户定义转换→标准转换」的序列?

有观点称此类序列不存在,这是对规范的误解,cppreference的描述完全准确,这类序列是合法存在的。

示例代码

class Base {};
class Derived : public Base {
public:
    // 用户定义转换:int 转换为 Derived(构造函数)
    Derived(int n) {}
};

// 目标参数类型为 const Base&
void func(const Base&) {}

int main() {
    short s = 42;
    func(s); // 触发完整的三步隐式转换序列
}

转换序列拆解

  1. 第一步:标准转换:short 提升为 int(整数提升,属于标准转换序列);
  2. 第二步:用户定义转换:int 通过 Derived 的构造函数转换为 Derived 对象(单个用户定义转换操作);
  3. 第三步:标准转换:Derived 对象绑定到 const Base&(派生类到基类的引用转换,属于标准转换序列)。

结论

cppreference的描述符合C++标准,「标准转换→用户定义转换→标准转换」的隐式转换序列是合法存在的。错误观点源于对标准转换范围的认知不全——派生类到基类的引用转换、限定符转换(如volatile/const添加)等都属于标准转换,可作为序列的最后一步。

内容的提问来源于stack exchange,提问作者dwto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:52:17