我最近调试了一些遗留代码:
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
变量在0
第一次调用时有时(很少)等于SomeMethod
。
C ++标准是否保证在访问之前必须初始化本地静态变量,或者这是编译器的错误?
P.S。永远不会在SomeDataLength构造函数之外修改value
数组。编译器是Visual Studio 2010中的编译器。