24

g++ 4.7.2 是否实现std::set::emplace了 C++11 标准所定义并在此处记录的?

我写了以下小测试用例:

#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 下编译。

4

2 回答 2

26

它没有在 gcc 4.7.2 中实现。

有一些解释:

只是澄清一下:这不是疏忽。我们在带有 std::pair 的 C++0x 标准草案中遇到了令人讨厌的 问题,这基本上使得在不破坏现有用户代码的情况下将 emplace_* 成员添加到 std::map、std::multimap 等是不可能的。因此,我们一直在等待,直到整个领域的事情都得到澄清。现在实际上可以在这些设施上工作。

您的代码可以使用 gcc 4.8.0 很好地编译,请参阅LWS

于 2013-04-04T13:55:31.727 回答
5

emplace()为 gcc 4.8.0 添加了关联容器libstdc++,在 gcc 4.7.2 下它不起作用。

于 2013-04-04T13:36:10.097 回答