3

我正在尝试将指向structs 数组的指针作为模板参数传递。一段时间后我设法做到了:

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
}

这是数组不能透明地用作指针的罕见情况之一,还是编译器错误?

4

2 回答 2

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。)

于 2012-11-27T03:04:26.617 回答
1

用 Apple clang v4.1 玩弄这个,我得到了下面的编译代码。我不得不承认我不知道 Clang 坚持对singleand进行外部链接是否正确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

于 2012-11-27T03:40:25.223 回答