将参数包传递给emplace stl函数会导致编译错误

Avr*_*dis 4 c++ stl variadic-templates c++11

根据emplace_back的定义,void emplace_back (Args&&... args);是一个可变参数模板函数.所以,我写了以下内容:

#include <vector>

int main()
{
  std::vector<int> myvector2(10,0);
  myvector2.emplace_back(1,2,3,4,5,6);
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨:

g++ -std=c++0x stlstudy.cc
‘
Internal compiler error: Error reporting routines re-entered.
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.7/README.Bugs> for instructions.
Preprocessed source stored into /tmp/cc7q32tE.out file, please attach this to your bugreport.
Run Code Online (Sandbox Code Playgroud)

操作系统警报:

Sorry, Ubuntu 13.04 has experienced an internal error.
Run Code Online (Sandbox Code Playgroud)

/tmp/cc7q32tE.outfilen太长,张贴在这里,也许它不会帮助.我做错了什么还是编译错误?我不明白.

在评论和错误报告之后: jrok给出了一个非常好的解释为什么会发生这种情况.我使用gcc 4.7,我报告了这个bug,我得到了以下响应:

Jonathan W***** <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
      Known to work|                            |4.8.0

--- Comment #1 from Jonathan W***** <redi at gcc dot gnu.org> ---
Seems to be fixed for 4.8 already.
Run Code Online (Sandbox Code Playgroud)

jro*_*rok 7

内部编译器错误不是你的错.编译器应该在输入不良的情况下提供有意义的诊断,而不仅仅是崩溃.

但是,参数的数量和类型emplace_back必须与vector的值类型的一个构造函数匹配.你有一个ints 向量,所以你最多可以传递一个具有匹配类型或可以隐式转换为的参数value_type.(您可以将参数列表留空 - 这将使用默认构造函数构造对象).

std::vector<int> v;
v.emplace_back(1);   // ok
v.emplace_back(1.0); // ok
v.emplace_back(1, 2); // not ok, there's no constructor for `int` that takes two ints
Run Code Online (Sandbox Code Playgroud)

目的emplace_back是不要在同一个语句中推送多个元素(我得到的印象是这是你期望它做的 - 我以前认为相同)但是要构建一个元素,将参数转发给构造函数和避免副本).

Gcc 4.8.没有错误了,虽然错误消息不是particulalry helpul.