阅读完内联函数中的静态变量后,我编写了以下测试程序:
main.cpp:
#include <iostream>
#include "a.h"
#include "f.h"
void g();
int main()
{
std::cout << "int main()\n";
f().info();
g();
}
a.h:
struct A
{
A() { std::cout << "A::A()\n"; }
void info() { std::cout << this << '\n'; }
};
f.h:(由于未命名的命名空间,每个编译单元都是单例局部的)
namespace {
inline A& f()
{
static A x;
return x;
}
}
g.cpp:
#include <iostream>
#include "a.h"
#include "f.h"
void g()
{
std::cout << "void g()\n";
f().info();
}
问题在于我使用不同的编译器得到的结果不同:
g++ 4.8.2:正常
int main()
A::A()
0x6014e8
void g()
A::A()
0x6014d0
clang++ 3.7.0:通过
int main()
A::A()
0x6015d1
void g()
A::A()
0x6015c1
icpc 15.0.2:在 g() 函数内没有调用 A::A()!
int main()
A::A()
0x601624
void g()
0x601620
这是icpc的一个错误吗?程序的行为没有定义吗?如果我在f.h中用"static"替换"namespace {...}",则g()内会按预期调用A::A()。行为不应该相同吗?
如果我删除f.h中的"namespace {...}",则A::info()会在main()和g()中打印相同的对象地址,并且A::A()只会像预期的那样被调用一次(使用所有编译器)。
main()
输出"void g()\n"
。 - Arne Vogel