【问题标题】:Is a static member function defined inside a class implicitly inlined?类中定义的静态成员函数是否隐式内联?
【发布时间】:2013-12-31 06:35:49
【问题描述】:

据我所知,类中定义的每个非静态成员函数都是隐式内联的。 现在我想知道这对静态成员函数是否有效,考虑到我可以在不同的翻译单元中多次定义该函数。

举个例子:

class Foo {

public:

    static void static_f(void) { std::cout << static_data << std::endl; } //Is it inline?
    static void static_f2(void); //I guess it isn't

private:

    static int static_data;
    int non_static_data;
};

PS:在这个文件 (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf) 我发现了这行:

9.4.1 静态成员函数 [class.static.mfct] 1 [ 注意:9.3 中描述的规则适用于静态成员函数。 ——尾注]

之前在第 9.3 节中:

可以在其类定义中定义(8.4)成员函数,在 在这种情况下,它是一个内联成员函数 (7.1.2) [...]

【问题讨论】:

  • 是的,但如果您担心的话,输入 inline 关键字不会有任何害处。
  • 函数将是inline,这并不意味着它将被内联

标签: c++ function static inline


【解决方案1】:

是的。

我会引用标准,但你已经这样做了。

考虑到我可以在不同的翻译单元中多次定义函数。

只有在您保证内容相同的情况下,这不是问题。

请确保不要将“声明”和“定义”混为一谈——只有当您在类定义中提供函数体时,才适用。这也让您不必担心。

// "Is it inline?"      YES.
static void static_f(void) { std::cout << static_data << std::endl; }

// "I guess it isn't"   Nope.
static void static_f2(void);

最后,请注意这些函数将被隐式标记为inline,但这与实际内联不同。

【讨论】:

  • +1。请注意,尽管static 或非静态的,所有成员函数都是内联的,如果它们是在类本身中定义的。
猜你喜欢
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 2014-01-18
  • 2014-02-17
  • 2021-01-10
相关资源
最近更新 更多