在构造函数中调用静态方法

Calling static methods in constructor

这对我来说似乎有点奇怪。由于静态方法可以有一个 class 的实例,因此人们自然希望编译器不允许在构造函数内部调用静态方法。但我已经用每个编译器测试了以下代码,具有讽刺意味的是,其中 none 给了我一个警告。虽然在执行时它们都抛出异常。我在这里遗漏了什么吗?

#include <iostream>

class Foo
{
public:
    inline Foo()
    {
        std::cout << "testing: var = " << bar() - 1 << '\n';
    }
    ~Foo(){}

    static int bar()
    {
        Foo f;
        f.var = 10;
        return f.test();
    }
private:
    int var;
    int test()
    {
        return var + 1;
    }
};

int main()
{
    Foo foo;
    return 0;
}

Live example

没有理由不在构造函数中调用静态(或实际上是非静态)成员函数(尽管不建议调用虚函数)。

在构造函数中调用静态函数并不违法。只有,如果你像你那样做,你会得到一个堆栈溢出。这导致

Foo() 调用 bar(); bar() 调用 Foo(); Foo() 调用 bar(); bar() 调用 Foo(); ...

直到没有剩余堆栈。

这与您拥有的完全相同:

void f1();
void f2()
{
    f1();
}
void f1()
{
    f2();
}
int main(int, char*[])
{
    f1();
    return 0;
}

只有两个全局函数,仅此而已。在 C 中也一样(但你确实在那里声明 void f(void)),或 Java、C#、perl、python、...

您期待什么警告?你写的是一个无限递归,与静态成员函数无关。您可以使用 class 内部或外部的任何其他函数来完成此操作。

静态函数与免费函数没有太大区别。那么自由函数也应该被构造函数禁止吗?禁止从构造函数调用静态函数是没有意义的。