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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:42:03