emplace_back和VC++的挫败感

Kai*_*aan 7 c++ stl vector visual-c++ c++11

我正在使用Visual Studio 2012,尝试使用默认编译器和Nov CTP编译器,下面显示了我的问题:

struct doesCompile
{
    int mA, mB, mC, mD, mE;

    doesCompile(int a, int b, int c, int d, int e) : mA(a), mB(b), mC(c), mD(d), mE(e)
    { 
    }
};

struct doesNotCompile
{
    int mA, mB, mC, mD, mE, mF;

    doesNotCompile(int a, int b, int c, int d, int e, int f) : mA(a), mB(b), mC(c), mD(d), mE(e), mF(f)
    { 
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<doesCompile> goodVec;
    goodVec.emplace_back(1, 2, 3, 4, 5);

    std::vector<doesNotCompile> badVec;
    badVec.emplace_back(1, 2, 3, 4, 5, 6);  //  error C2660: 'std::vector<_Ty>::emplace_back' : function does not take 6 arguments

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么它看起来似乎emplace_back上限最多有5个参数?他们甚至在http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx中说它需要一定数量的参数.

有没有办法解决这个问题,使用VS2012?

Kon*_*lph 7

这是由以前的Visual C++编译器体系结构引起的限制.VC++的未来版本将解除限制并允许真正的可变参数模板.

目前,您可以通过代码中包含以下内容之前添加以下内容来静态提高虚假可变参数模板的最大限制:

#define _VARIADIC_MAX 6
Run Code Online (Sandbox Code Playgroud)

这将限制为6而不是5(最大可能值为10),但代价是编译速度降低.


Tem*_*Rex 4

VS2012 11 月 CTP编译器支持可变参数模板,但其标准库尚未在该版本中更新。应该在 VS2013RC 中修复。强烈建议升级,因为即使是 11 月的 CTP 也包含很多错误。如果不可能,请使用 Konrad Rudolph 提到的宏。