7

次のコード スニペットを検討してください。

void Foo(std::string str1, std::string str2) {}

template<typename... Types>
void Bar()
{
    Foo(Types{}...); // wont compile
}

Bar<std::string, std::string>();

ここでやりたいことは、デフォルトでメソッドstd::string内に 2 つのオブジェクトを構築Barし、それらを に渡すことFooです。しかし、私の無駄な試み(そのうちの1つはスニペットにあります)はコンパイルできないので、これが可能かどうか疑問に思っています。

VC 2013 でコンパイルしたところ、コンパイラ エラーが発生しました。コメントに記載されているように、他のコンパイラはそれを処理できます。上記のスニペットが標準に準拠しているかどうかは誰にもわかりますか?

4

2 に答える 2

8

これは、MSVC 可変個引数テンプレート展開プロセスの問題です。型のリストをアンパックすると、それらがコンストラクター呼び出しに適していると認識されません。回避策として、型変換を実行して、コンパイラにそれらを認識させることができます。

template<typename T> using identity_t = T;  // NEW CODE

void Foo(int, int);

template<typename... Types>
void Bar()
{
    Foo(identity_t<Types>{}...);  // use identity type transformation
}

int main() {
    Bar<int, int>();
}

私はまだ問題番号を見つけることができませんでした。

于 2014-02-06T20:17:00.387 に答える