C++标准-用户定义-标准转换序列示例求证及规范正确性疑问
C++隐式转换序列:标准转换→用户定义转换→标准转换的合理性分析
规范定义
C++规范明确隐式转换序列的组成顺序为:
- 零个或一个标准转换序列;
- 零个或一个用户定义转换;
- 零个或一个标准转换序列(仅当使用了用户定义转换时)。
常见的隐式转换序列分为两类:
- 标准转换序列 → 用户定义转换
- 用户定义转换 → 标准转换序列
核心疑问:是否存在「标准转换→用户定义转换→标准转换」的序列?
有观点称此类序列不存在,这是对规范的误解,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); // 触发完整的三步隐式转换序列 }
转换序列拆解
- 第一步:标准转换:
short提升为int(整数提升,属于标准转换序列); - 第二步:用户定义转换:
int通过Derived的构造函数转换为Derived对象(单个用户定义转换操作); - 第三步:标准转换:
Derived对象绑定到const Base&(派生类到基类的引用转换,属于标准转换序列)。
结论
cppreference的描述符合C++标准,「标准转换→用户定义转换→标准转换」的隐式转换序列是合法存在的。错误观点源于对标准转换范围的认知不全——派生类到基类的引用转换、限定符转换(如volatile/const添加)等都属于标准转换,可作为序列的最后一步。
内容的提问来源于stack exchange,提问作者dwto
相关产品推荐
相关产品推荐

