【发布时间】:2014-10-27 07:40:42
【问题描述】:
不要问我为什么,但我试图在编译时初始化一个指针数组(指针指向另一个静态数组的元素)。这涉及 TMP,因此在构建可变参数列表时需要模板递归。我已将问题缩小到以下几点:
template <int const * const P>
struct Foo
{
constexpr static int const * const bar = P;
};
constexpr int const array[5] = {0, 1, 2, 3, 4}; // global, so has linkage
int main()
{
/* 1 */ cout << *Foo<array>::bar << '\n';
/* 2 */ cout << *Foo<array + 1>::bar << '\n';
/* 3 */ cout << *Foo<&array[1]>::bar << '\n';
}
案例 1 工作正常,并打印 '0'。
案例 2 无法编译,GCC (4.9.1) 报错:
error: ‘(((const int*)(& array)) + 4u)’ is not a valid template argument for ‘const int*’ because it is not the address of a variable
cout << *Foo<array + 1>::bar << '\n';
^
案例 3 无法编译,GCC 报错:
error: template argument 1 is invalid
cout << *Foo<&array[1]>::bar << '\n';
我主要关心案例2。为什么不能做常量指针算术并将结果传递给模板?
【问题讨论】:
标签: c++ templates pointers c++11 metaprogramming