"inline"隐式于类定义中定义的C++成员函数中
Is "inline" implicit in C++ member functions defined in class definition
根据C++规范,以下两个类是否等价定义?
class A
{
void f()
{
}
};
class B
{
inline void f()
{
}
};
即,在类定义中定义的成员函数上放置"内联"限定符是否完全多余?
接下来的问题是:假设它是多余的,对于代码风格来说,保留"内联"标记是否明智,这样未来的开发人员就会意识到函数应该内联,而不是在其他地方删除定义并删除内联?
感谢:)
C++ISO标准规定:
类定义中定义的函数是内联函数。
但是,这并不意味着函数一定会内联:现在,编译器似乎会决定内联函数是否会带来任何好处。
除了"一个定义规则"的目的之外,它们是等效的类定义。因此,该标准并不能保证您可以用一个类定义编译一个TU(翻译单元),用另一个编译不同的TU,然后将它们链接在一起。我怀疑这在真正的实现中是否会失败,但这就是标准所说的。
inline
关键字与内联几乎没有任何关系。这是关于在不同的TU中是否允许对函数进行多个相同的定义。如果有人将函数定义移到其他地方,那么他们应该根据以下情况决定是否将其标记为inline
:
-
如果它在该类的
.cpp
文件中,那么如果它仅从该TU调用,则将其标记为inline
是有效的。那么,它是否标记为inline
可能没有什么区别,但如果您认为编译器会注意您想要的内容,则可以将其标记成inline
作为编译器提示。 -
如果它仍在头文件中,则必须将其标记为
inline
,否则在链接使用该头的不同TU时会出现多个定义错误。
假设移动函数的人知道这些事情,我认为他们不需要在类定义中提醒。如果他们不知道这些事情,那么他们可能就没有必要移动函数,但对他们来说,有一个inline
关键字来移动它会更安全
将"内联"限定符放在类定义中定义的此类成员函数上是否完全多余?
是
对于代码风格,保留"inline"标记是否明智,这样未来的开发人员就会意识到函数应该内联,而不是在其他地方删除定义并删除内联?
没有
内联用于"一个定义规则"(因此通过扩展进行链接)。如果函数是在需要inline
的地方定义的,但没有提供,则是编译时错误。如果不需要它,那么它只是多余的无用绒毛。
所以,如果你不需要它,就把它删除。如果你需要它,把它放在那里(如果你忘记了编译器会让你知道的)。
在这种情况下,内联是可选的,是的。编译器将知道它是内联的,并且无论何时包含头,都不会生成函数的多个实例。
至于把它留在那里是否是个好主意,我真的不这么认为。最好给出一个详细的注释来解释为什么函数必须内联(其中我可以忽略两个原因:要么是"它是一个模板",在这种情况下不可能内联,要么是"性能",在那种情况下我想看到一些支持证据,而不是我在某些地方看到的"它必须表现得更好,因为它是内联的"。
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何定义一个纯抽象基类