g ++ 4.7.2是否按照C ++ 11标准的定义实现了std::set::emplace
并记录了here?
我写了以下小测试用例:
#include <set>
#include <string>
struct Foo
{
std::string mBar;
bool operator<(const Foo& rhs) const
{
return mBar < rhs.mBar;
}
Foo(const std::string bar) : mBar(bar) {};
};
typedef std::set<Foo> Foos;
int main()
{
Foos foos;
foos.emplace(std::string("Hello"));
}
在G ++ 4.7.2下,无法编译:
[john.dibling@somewhere hacks]$ g++ -o main.o -std=c++0x -c main.cpp
main.cpp: In function ‘int main()’:
main.cpp:19:10: error: ‘Foos’ has no member named ‘emplace’
也无法在IDEOne下编译,但它在MSVC 2012 Update 1下编译。
答案 0 :(得分:26)
It is not implemented in gcc 4.7.2.
有一些解释:
只是澄清一点:这不是疏忽。我们有讨厌的 草案C ++ 0x标准与std :: pair的问题,基本上 无法将emplace_ *成员添加到std :: map, std :: multimap等,不会破坏现有的用户代码。因此我们 等待,直到整个地区的事情得到澄清。现在 它实际上可以在这些设施上工作。
您的代码与gcc 4.8.0很好地编译,请参阅LWS。
答案 1 :(得分:5)
emplace()
中添加了 libstdc++
关联容器,在gcc 4.7.2下,它将无效。