我正在尝试将指针传递给struct
s数组作为模板参数。一段时间后我设法做到了:
struct something{};
constexpr const something single;
constexpr const something array[12];
template<const something* arg> void f() {}
template<typename T>
constexpr T* workaround(T* v){
return v;
};
void bind(){
f<&single>(); //OK
f<array>(); //NO
f<&array>(); //NO
f<&array[0]>(); //NO
f<workaround(array)>(); //NO
f<(const something*)array>(); //OK
}
这是极少数情况下,数组不能透明地用作指针,还是编译器错误?
答案 0 :(得分:1)
我实际上认为,如果只是正确地声明定义f<array>();
,那么最简单的调用形式array
会起作用:
struct Elem
{ };
constexpr const Elem array[5] { {} , {} , {} , {} , {} };
template<const Elem* arg> void f()
{ }
int main()
{
f<array>();
return 0;
}
我唯一改变的事情(除了将数组从12个元素减少到5个元素之外)就是为array
添加初始值设定项。
(这为我编译,使用GCC 4.7.2。)
答案 1 :(得分:1)
使用Apple clang v4.1搞砸了这个,我已经到了下面编译的代码了。我不得不承认我不知道Clang坚持single
和array
的外部链接是否正确。此外,基于jogojapan的修改,没有特别的原因。
struct Elem {};
extern const Elem single;
extern const Elem array[3];
constexpr const Elem single {};
constexpr const Elem array[3] {{},{},{}};
template<const Elem* arg> void f()
{ }
int main()
{
f<&single>();
f<array>();
return 0;
}
FWIW,我在遇到这个问题后在黑暗中到达了这个镜头: http://lists.apple.com/archives/xcode-users/2006/Jun/msg00799.html