在静态成员变量初始化器中为什么要调用静态成员函数(不是全局函数)?

时间:2016-04-06 03:26:04

标签: c++ static language-lawyer static-methods

以下程序的输出应该是什么?

#include<iostream>

int foo()
{
  return 10;
}

struct foobar
{
  static int x;
  static int foo()
  {
    return 11;
  }
};

int foobar::x = foo();

int main()
{
  std::cout<<foobar::x<<endl;
}

我已经运行了该程序但得到了答案11,但我认为正确的答案应该是10。我不知道为什么foo() int foobar::x = foo();应该是静态函数,请帮助我理解这一点。关于使用静态函数的更多例子将是首选!

1 个答案:

答案 0 :(得分:3)

因为初始化表达式在struct foobar的范围内,所以这里将调用foobar::foo()

从标准$9.4.2/2 Static data members [class.static.data]

开始
  

初始化表达式   静态数据成员的定义在其类的范围内(3.3.7)。例如:

class process {
static process* run_chain;
static process* running;
};
process* process::running = get_main();
process* process::run_chain = running;
     

run_chain的静态数据成员process在全局中定义   范围;符号process::run_chain指定该成员   run_chain是类process的成员,属于类的范围   process。在静态数据成员定义中,初始化程序   expression指的是类running的静态数据成员process。    - 例子]