3

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
}

これは、配列をポインタとして透過的に使用できないまれなケースの1つですか、それともコンパイラのバグですか?

4

2 に答える 2

1

Apple clang v4.1でこれをいじって、コンパイルされる以下のコードにたどり着きました。singleClang がとの外部リンケージを主張するのが正しいかどうかわからないことを認めなければなりません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 に答える
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 に答える