构造包含引用的unordered_map是否合法?

时间:2017-10-16 12:24:42

标签: c++ reference containers unordered-map

通常,STL容器不能保存非CopyAssignable类型,例如引用。如果我以不应该进行复制的方式构造容器,那么代码是有效的。它使用std=c++11c++14与某些版本的gcc-7.2进行编译,但是以下是有效的还是我希望它能够在库升级时中断?在这种情况下我应该使用reference_wrapper吗?

#include <unordered_map>

struct S {};

void use (S&) {}

void test() {
    S s1, s2;
    const std::unordered_map<int, S&> m{{0, s1}, {1, s2}};
    use(m.at(0));
}

编辑我确实需要参考标准。如果符合标准的编译器/标准库更新可能会破坏代码,那么对我来说也是不够的。所以"unordered_map with reference as value"给出的答案对我来说还不够。

1 个答案:

答案 0 :(得分:1)

我想我自己找到了这个特定用例的答案:

第23.5.4.3节中针对unordered_map元素访问的C++11标准明确省略列出char的任何要求,即mapped_type,而S&必须是operator[] DefaultConstructible

mapped_type& at(const key_type& k);
const mapped_type& at(const key_type& k) const;
     

返回:对x.second的引用,其中x是(唯一)元素,其键相当于k

     

引发:如果不存在此类元素,则为out_of_range类型的异常对象。

C++17也间接地在26.5.4.3和26.5.4.4中说明了这一点。

因此,上述代码适用于任何标准实现。

然而,正如评论中所指出的那样,在构造之后改变容器或应用任何需要构建或分配容器的value_typemapped_type无效。