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
相关产品推荐
相关产品推荐

