この単純化された C++11 コードを考えてみましょう。これは、2 つの静的変数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;
}
このコードを最適化せずに (つまり-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 は staticvalue
フィールドを問題なく出力できます。これにより、この問題は、特定の型の非型テンプレート パラメーターを持つ (インスタンス化された) クラス テンプレートの静的フィールドに固有のものであると思われます。
誰でもこれに光を当てることができますか?のバグgdb
ですか?もしそうなら、これらのタイプの変数をデバッグできるように簡単な方法はありますか?
注:私はgdb
(7.6.1)、gcc
(4.8.2)、clang
(3.4) を使用しています。これらはすべて最新バージョンです。