2

次のコードを検討してください。

#include <initializer_list>

struct X{
    static void init(const std::initializer_list<void*>& ptrs){}
};

template <typename T>
struct Y{   

    static void foo(){
        X::init({ nullptr });
    }

};

fooクラス テンプレートの関数Y<T>X::init、単一のnullptr. うまくいくはずですよね?

ただし、私の g++ 4.6.1 は文句を言います:

test11.cpp: In static member function 'static void Y<T>::foo()':
test11.cpp:12:23: error: no matching function for call to 'X::init(<brace-enclosed initializer list>&)'
test11.cpp:12:23: note: candidate is:
test11.cpp:5:15: note: static void X::init(const std::initializer_list<void*>&)
test11.cpp:5:15: note:   no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'const std::initializer_list<void*>&'

からテンプレート パラメータを削除するYと、つまり通常のクラスにすると、すべて正常に動作します。私は何を間違っていますか、それともこれはコンパイラのバグですか?

4

1 に答える 1

1

これはほぼ間違いなくコンパイラのバグであり、GCC の新しいバージョンで動作することが確認されています (コメントを参照)。個人的には、それが機能しない理由はわかりません。

于 2012-09-10T20:03:24.287 に答える