C++ 具有自定义值类型的map::emplace()
我在使用C++ 具有自定义值类型的map::emplace(),c++,gcc,c++11,gcc4.7,C++,Gcc,C++11,Gcc4.7,我在使用map::emplace()时遇到问题。有人能帮我找出正确的语法吗?实际上,我正在尝试做与中相同的事情。以下是我的版本: #include <map> using namespace std; class Foo { // private members public: Foo(int, char, char) /* :init(), members() */ { } // no default ctor, copy ctor, move ct
map::emplace()
时遇到问题。有人能帮我找出正确的语法吗?实际上,我正在尝试做与中相同的事情。以下是我的版本:
#include <map>
using namespace std;
class Foo
{
// private members
public:
Foo(int, char, char) /* :init(), members() */ { }
// no default ctor, copy ctor, move ctor, or assignment
Foo() = delete;
Foo(const Foo&) = delete;
Foo(Foo &&) = delete;
Foo & operator=(const Foo &) = delete;
Foo & operator=(Foo &&) = delete;
};
int main()
{
map<int, Foo> mymap;
mymap.emplace(5, 5, 'a', 'b');
return 0;
}
#包括
使用名称空间std;
福班
{
//私人成员
公众:
Foo(int,char,char)/*:init(),members()*/{}
//无默认ctor、复制ctor、移动ctor或赋值
Foo()=删除;
Foo(const Foo&)=删除;
Foo(Foo&&)=删除;
Foo&运算符=(const Foo&)=删除;
Foo&运算符=(Foo&&)=删除;
};
int main()
{
地图我的地图;
mymap.emplace(5,5,'a','b');
返回0;
}
在GCC4.7(带有
-std=c++11
标志)下,我在安置
行出错。没有说明如何处理自定义类型而不是原语。GCC4.7不完全支持emplace
函数
您可以在GCC4.7.2中看到对C++11的支持。容器的
emplace
成员使用提供的参数构造元素
映射的value\u type
是std::pair
,并且该类型没有使用参数{5,5,'a',b'}
的构造函数,即,这不起作用:
std::pair<const int, Foo> value{ 5, 5, 'a', 'b' };
map.emplace(value);
但是GCC4.7也不支持这种语法(GCC4.8发布后会支持这种语法)。我很担心。我尝试的语法是否正确?也就是说,它能在其他编译器上工作吗?另外,
emplace()
可以与map
一起工作,就像在cplusplus.com示例中一样。@SchighSchagh您可能需要转发作为元组,我不确定,因为我从未使用过emplace
。这是调用不能工作的一个合理原因。事实上,您有另一个并不是向下投票的理由。链接的文档已经过时,GCC主干(该页面所指)确实支持map::emplace
,GCC 4.7的正确链接是,即使在GCC 4.7上,它似乎也可以正常工作。谢谢FWIW,我使用了std::forward_as_tuple()
而不是std::make_tuple()
,因为我认为它应该稍微优化一些,但我不确定区别是什么。forward_as_tuple(5,'a','b')
创建tuple
和make_tuple(5,'a','b')
创建tuple
。通常,forward\u as\u tuple
避免复制其参数并转发引用,但在这种情况下(使用int
和char
参数),make\u tuple
创建的副本可能比创建引用便宜。它的输入也更少:)对于C++17,map.try_emplace(5,5,'a','b')
;也可以使用。另请参见
mymap.emplace(std::piecewise_construct, std::make_tuple(5), std::make_tuple(5, 'a', 'b'));