(默认)为每个可变参数类型构造一个对象

Seb*_*ann 7 c++ visual-c++ compiler-bug variadic-templates c++11

请考虑以下代码段:

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

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

Bar<std::string, std::string>();
Run Code Online (Sandbox Code Playgroud)

我想在这里做的是默认std::stringBar方法中构造两个对象并将它们传递给Foo.然而,我徒劳的尝试(其中一个在片段中)不会编译,所以我想知道这是否可能.

我使用VC 2013编译,这会向我抛出编译器错误.如评论中所述,其他编译器可以处理它.任何人都可以判断上面的片段是否符合标准吗?

eca*_*mur 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>();
}
Run Code Online (Sandbox Code Playgroud)

我还没有设法找到一个问题编号.

  • `template <typename T>使用identity_t = T;`也可以,不需要`typename`和`:: type`装饰. (2认同)