具有 T=<unnamed namespaced class> 的函数模板专用化的静态局部变量是否需要是唯一的?
Are static locals of function template specializations with T=<unnamed namespaced class> required to be unique?
我们使用Intel 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 != %dn", 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
我很感激你的帮助。也许这实际上是一个编译器错误,它已经被报告了? 我觉得这像是一个bug。让A1
为A
的实例化之一,A2
为另一个实例化:
我假设静态x
具有弱链接,以便链接器可以在相同实例化的多个副本之间合并静态副本。(例如,如果您设法在两个不同的翻译单元中实例化f<A1>
。)
f<A1>
和f<A2>
应该有不同的名称混淆,这将导致x
的两个版本有不同的名称混淆(我认为一些编译器实际上生成一个随机值,使匿名命名空间内的名称唯一),或者x
不应该有内部链接(因为一个本地类型被用来实例化f
,这应该使它不可能复制在另一个翻译单元)。
相关文章:
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++:是否可以使用非静态成员变量模板?
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 检查编译时是否存在静态函数
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- C++编译器是否优化了顺序静态变量读取?
- 返回从字符串文本创建的静态string_view是否安全?
- 这些语句是否等效(静态变量、常量变量和泛型)
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 初始值设定项列表是否足够静态以允许实例化模板?
- 程序如何知道静态变量是否需要初始化?
- 是否使用静态 constexpr 变量 odr?
- 使用静态成员函数而不是普通函数是否有任何开销?
- 如果可能,标准::映射分配是否静态