我正在尝试使用模板递归来生成嵌套的POD结构体,但我遇到了一些意外的行为。这里是一个简化的测试案例:
#include <cstddef>
template<std::size_t size>
struct RecursiveStruct {
public:
template <std::size_t start, std::size_t length>
struct Builder {
static const Builder value;
static const size_t mid = start + length / 2;
static const size_t end = start + length;
Builder<start, mid - start> left;
Builder<mid, end - mid> right;
};
template <std::size_t start>
struct Builder<start, 1> {
static const Builder value;
int data;
};
static const Builder<0, size> result;
};
template<std::size_t size>
const typename RecursiveStruct<size>::template Builder<0, size>
RecursiveStruct<size>::result = Builder<0, size>::value;
template<std::size_t size>
template<std::size_t start, std::size_t length>
const typename RecursiveStruct<size>::template Builder<start, length>
RecursiveStruct<size>::Builder<start, length>::value
= { Builder<start, mid - start>::value, Builder<mid, end - mid>::value };
template<std::size_t size>
template <std::size_t start>
const typename RecursiveStruct<size>::template Builder<start, 1>
RecursiveStruct<size>::Builder<start, 1>::value = { 5 };
////////////////////////////////////////////////////////
#include <iostream>
using std::cout;
using std::endl;
using std::size_t;
int main() {
cout << RecursiveStruct<1>::result.data << endl;
cout << RecursiveStruct<2>::result.left.data << endl;
return 0;
}
我希望这段代码能够输出
5
5
使用GCC 4.8.4和5.1编译时会生成这个。
但是,使用Clang(3.5或3.7)或Visual Studio 2010进行编译则会产生不同的结果。
5
0
我的代码或者我的理解方式哪里有问题,还是Clang和Visual Studio都有错误导致出现相同的错误输出?
fd()
可能会被编译器内联或不内联,因此d1
可以是动态初始化或静态初始化,这就是为什么d2
是未指定的原因。在我的情况下,一切都是const POD,所以应该全部静态初始化。 - rkjnsn