c++ - 带有静态变量的静态内联函数

标签 c++ c++11

看完static variables in an inlined function ,我写了这个测试程序:

主要.cpp:

#include <iostream>
#include "a.h"
#include "f.h"

void g();

int main()
{
    std::cout << "int main()\n";
    f().info();
    g();
}

嗯:

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 中将“命名空间 {...}”替换为“静态”,则 A::A() 将按预期在 g() 内部调用。行为不应该相同吗?

如果我在 f.h 中删除“namespace {...}”,A::info() 在 main() 和 g() 中打印相同的对象地址,并且 A::A() 仅被调用一次(使用所有编译器)如预期。

最佳答案

由于 C++11 要求未命名命名空间中的名称具有内部链接,每个翻译单元都应该有它自己的 f() 版本,因此,它有自己的 版本静态 A x。所以 gcc 和 clang 是正确的。

似乎 icpc 不遵循 C++11 标准,而是遵循 C++03,这允许使用外部链接声明这些名称。因为当您通过使用 static icpc 显式地将 f() 设置为内部时,我强烈怀疑这只是一个错误。

关于c++ - 带有静态变量的静态内联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34927447/

相关文章:

c++ - 通过索引访问可变参数模板中的类型

C++ 使用具有 unique_ptr、make_unique 的已删除函数

c++ - 冒号的含义

c++ - 将字符串文件路径转换为唯一标识符

c++ - 是否可以允许一种 std::function 类型接受具有不同签名的 lambda

c++ - 为什么删除移动构造函数后我的对象没有被复制?

C++0x 编译器支持问题

c++ - _cvLoadImage undefined symbol 链接问题

python - 从 C++ 运行 .py 脚本

c++ - 当模板类未专门化时,为模板类的模板成员函数编写专门化的解决方法