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

时间:2014-02-06 19:54:18

标签: c++ visual-c++ c++11 variadic-templates compiler-bug

请考虑以下代码段:

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

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

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

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

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

2 个答案:

答案 0 :(得分: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>();
}

我还没有设法找到问题编号。

答案 1 :(得分:2)

这让我崩溃了VC 2013编译器。这些错误似乎表明解析代码时遇到了一些问题。因此,当编译器崩溃时,它必定是编译器错误。

1>main.cpp(23): error C2144: syntax error     : 'std::string' should be preceded by ')'
1>          main.cpp(28) : see reference     to function template instantiation 'void Bar<std::string,std::string>(void)' being compiled
1>main.cpp(23): error C2660: 'Foo' :     function does not take 0 arguments
1>main.cpp(23): error C2143: syntax error     : missing ';' before '{'
1>main.cpp(23): error C2143: syntax error     : missing ';' before ','
1>c1xx : fatal error C1063: INTERNAL COMPILER ERROR
1>           Please choose the Technical Support command on the Visual C++ 
1>           Help menu, or open the Technical Support help file for more information
1>cl : Command line warning D9028: minimal rebuild failure, reverting to normal build
1>
1>Build FAILED.