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

C++20中默认函数是否为内联函数及相关技术问题

关于C++默认函数的内联属性问题

先给出代码示例:

struct tmp
{
    int va = 0;
    tmp() = default;
    bool operator==(const tmp& rhv) const = default; //(in c++20)
};

问题1:未添加inline关键字的默认构造函数tmp()和operator==是否属于内联函数?

是。根据C++标准,类内部定义的成员函数(包括使用= default显式默认生成的函数)会被编译器视为隐式内联函数,不需要手动添加inline关键字就具备内联函数的特性。

问题2:若答案为是,添加inline关键字后会产生什么变化?

没有实质性的语义变化。显式添加inline只是把原本隐式的内联属性明确写出来,和隐式内联的效果完全一致:编译器依然有权选择是否对函数进行内联展开,同时该函数也依然遵循内联函数的ODR(一次定义规则),允许在多个编译单元中存在定义而不会触发重定义错误。

问题3:是否可以强制它们成为常规函数?

可以。方法是将函数的声明保留在类内部,然后在类外部进行= default的定义,并且不添加inline关键字。示例如下:

struct tmp
{
    int va = 0;
    tmp(); // 类内声明
    bool operator==(const tmp& rhv) const; // 类内声明
};

// 类外默认定义,无inline,属于常规函数
tmp::tmp() = default;
bool tmp::operator==(const tmp& rhv) const = default;

这样定义的函数就属于常规的非内联成员函数,不再具备隐式内联的属性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:10:51