考虑这个简化的 C++11 代码,它只包装两个静态变量A
和B
:
template<typename T, T INITIAL_VALUE>
struct StaticValue { static T value; };
template<typename T, T INITIAL_VALUE> T
StaticValue<T, INITIAL_VALUE>::value { INITIAL_VALUE };
int main()
{
using A = StaticValue< int* , nullptr >;
using B = StaticValue< int , 0 >;
// reference (so code is generated) ...
static volatile void* p = 0;
p = &A::value;
p = &B::value;
return 0;
}
在or中编译此代码而不进行优化(即-O0
),然后像这样运行它:gcc
clang
gdb
(gdb) break main
(gdb) run
(gdb) info types StaticValue
StaticValue<int*, 0u>;
StaticValue<int, 0>;
(gdb) print StaticValue<int*, 0u>::value
static field value has been optimized out
(gdb) print StaticValue<int, 0>::value
$1 = 0
请注意,当您尝试打印StaticValue<int*, 0u>::value
gdb时static field value has been optimized out
,即使优化被禁用,但打印另一个静态值没有问题StaticValue<int, 0>::value
。
如果你INITIAL_VALUE
从类模板中删除非类型模板参数StaticValue
,这个问题就消失了,gdb 打印静态value
字段也没有问题。这使我相信该问题特定于具有某些类型的非类型模板参数的(实例化)类模板的静态字段。
任何人都可以对此有所了解吗?它是一个错误gdb
吗?如果是这样,有没有一种简单的方法可以调试这些类型的变量?
注意:我使用的是gdb
(7.6.1)、gcc
(4.8.2)、clang
(3.4),它们都是最新版本。