在下面的示例代码中,我使用对象a0作为非类型模板参数,这很有效,因为它是一个具有链接(lvalue-ref)的对象。所以我认为必须有可能使用数组元素,但是失败了:
constexpr uint8_t a[10] = {};
constexpr uint8_t a0 = {};
template<typename T, const T& V>
struct Test {};
using test = Test<uint8_t, a0>; // OK
using test = Test<uint8_t, a[0]>; //NOK
有没有办法让这个工作?
答案 0 :(得分:2)
绑定参考模板参数需要具有外部链接的对象的名称。单个数组元素在C ++中没有名称和链接。这就是参考模板参数不能绑定到数组元素的原因。有关详细信息,请参阅6.5 Program and linkage [basic.link]。
如果删除引用(如果可能),可以编译它:
template<typename T, T V>
struct Test {};
或者通过模板中的索引访问元素:
template<class T, T const& A, size_t Idx>
struct Test2 {
static constexpr decltype(A[Idx]) element = A[Idx];
static_assert(std::is_reference<decltype(element)>::value, "");
};
using test = Test2<decltype(a), a, 1>;