C++向接收Foo类型参数的Bar构造函数传int未报错的原因是什么?
核心原因
该现象由C++的隐式构造转换特性导致:
- 未被
explicit修饰的单参数构造函数属于转换构造函数,允许编译器在类型匹配需要时自动触发隐式转换,将入参类型转换为当前类的实例。 - 代码中
Foo类的Foo(int x)构造函数未加explicit修饰,支持从int到Foo的隐式转换。 - 执行
Bar obj_2 { 2021 }时,编译器检测到Bar的构造函数需要Foo类型的入参,会自动将2021隐式构造为Foo{2021}临时对象传入,整个过程符合C++语法规则,因此不会报错。
禁用隐式转换的方案
如果希望避免这类意料之外的类型转换,只需要给Foo的单参数构造函数添加explicit修饰:
class Foo { public: explicit Foo(int x) : y { x } { } private: int y; };
添加explicit后,编译器会禁止int到Foo的自动隐式转换,此时编译Bar obj_2 { 2021 }会直接触发类型不匹配的编译错误,符合预期。
内容的提问来源于stack exchange,提问作者Jaeho Choi
相关产品推荐
相关产品推荐

