我最近调试了一些像这样的遗留代码:
template<size_t count>
struct SomeData
{
char m_data[count];
};
template<>
struct SomeData<0>
{
};
template<int n>
struct SomeDataLength : public SomeDataLength<n-1>
{
SomeDataLength(){ value[n] = sizeof(SomeData<n>); }
};
template<>
struct SomeDataLength<0>
{
SomeDataLength(){ value[0] = sizeof(SomeData<0>); }
size_t value[10];
};
template<typename T>
void SomeClass::SomeMethod(size_t count)
{
...
static SomeDataLength<5> dataLength;
size_t length = dataLength.value[count]; // sometimes may be 0 on the method first call
...
}
令我惊讶的是,第一次调用时变量有时(很少)length
等于。C++ 标准是否没有保证在访问之前必须初始化局部静态变量,或者这是编译器的错误?0
SomeMethod
PSvalue
数组永远不会在 SomeDataLength 构造函数之外修改。编译器是来自 Visual Studio 2010 的编译器。