具有T = <unnamed namespaced =“”class =“”>的函数模板特化的静态局部变量是否必须是唯一的?

时间:2015-10-21 14:52:44

标签: c++ templates static undefined-behavior icc

我们使用英特尔C ++编译器并检测到它错误编译(?)以下内容,使用boost::function<Ponies()> f(unnamedNamespacedFunctor)而减少了。

a1.cc:

template<typename T>
int f(T) { static int x = T::x; return x; }


namespace { struct A { static const int x = 1; }; }

int f1() {
   return f(A());
}

a2.cc:

template<typename T>
int f(T) { static int x = T::x; return x; }


namespace { struct A { static const int x = 0; }; }

int f2() {
   return f(A());
}

main.cc:

#include <cstdio>

int f1();
int f2();

int main() {
   std::printf("%d != %d\n", f1(), f2());
} 

命令行:

# icpc a1.cc a2.cc main.cc -o main
# ./main
0 != 0

我的问题是:这是否合规?在这种实例化中使用静态本地是否会产生未定义的行为?在检查生成的符号时,我注意到虽然f具有本地链接,但我怀疑,x静态变量接收弱链接,因此合并了两个x es并且它成为选择的彩票

# icpc a2.cc a1.cc main.cc -o main
# ./main
1 != 1

我将不胜感激。也许这实际上是一个编译器错误,它已经被报道了?

1 个答案:

答案 0 :(得分:2)

对我来说这看起来像个错误。让 <Button android:id="@+id/buttonSkills" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_toEndOf="@+id/imageView2" android:layout_toRightOf="@+id/imageView2" android:onClick="buttonSkillsOnClick" android:text="@string/skills" android:textColor="#32c87d" android:textSize="22sp" /> 成为A1A的实例化之一:

我假设静态A2具有弱连接,以便链接器可以在相同实例化的多个副本之间合并静态副本。 (例如,如果您设法在两个不同的翻译单元中实例化x。)

f<A1>f<A1>应该有不同的名称修改,这会导致f<A2>的两个版本具有不同的名称修改(我认为一些编译器实际上会生成一个随机值匿名命名空间内的名称唯一),或者x不应该有内部链接(因为本地类型用于实例化x,这应该使其无法在另一个翻译单元中复制)。