根据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);
}
编译器抱怨:
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.
操作系统提醒:
Sorry, Ubuntu 13.04 has experienced an internal error.
/tmp/cc7q32tE.out
filen太长了,无法在此发布,也许无济于事。我做错了什么还是编译错误?我不明白。
评论和错误报告后: 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.
答案 0 :(得分:7)
内部编译器错误不是你的错。编译器应该在输入格式错误的情况下提供有意义的诊断,而不仅仅是崩溃。
但是,emplace_back
的参数的数量和类型必须与vector的值类型的一个构造函数匹配。您有一个int
的向量,因此您最多可以传递一个具有匹配类型或可隐式转换为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
emplace_back
的目的不是要在同一个语句中推送多个元素(我得到的印象是这是你期望它做的事情 - 我以前认为是相同的)但是要构造一个元素就地,将参数转发给构造函数并避免复制。)
Gcc 4.8。 does error out,虽然错误信息并非特别有帮助。