繁体   English   中英

std :: map中Key类型的赋值运算符要求

[英]Assignment operator requirement for Key type in std::map

似乎在这里建议std :: map密钥类必须满足哪些要求才能成为有效密钥? ,以及其他一些文章中,srd :: map的Key类型必须具有赋值运算符。 但是,我无法在标准中找到该要求。

#include <map>

struct Foo
{
    Foo& operator=( const Foo& ) = delete;

    int id;
};

bool operator<( const Foo&, const Foo& ) { return( false ); }

int main( int, char** )
{
    std::map<Foo,int> a;
    std::map<Foo,int> b;

    a = b;   // Should this work if Foo does not have an assignment operator?

    return( false );
}

上面的代码使用GCC 4.9和Visual Studio 2013编译,但是失败了,抱怨缺少赋值运算符,在运行以下命令的Ubuntu 14.10机器上使用clang 3.5,运行以下命令“ clang ++ -std = c ++ 11 -stdlib = libc ++ code.cpp ”。 使用GCC标准库时,Clang确实成功。 我怀疑clang标准库在这里坏了。

§23.1[container.requirements.general] / p15和表99:

在表99中, X表示使用类型A分配器的value_typeT识别分配器的容器类, u表示变量, ab表示类型X非常量左值, t表示类型的lvalue或const rvalue Xrv表示类型X非常数值, m是类型A的值。

表99(可识别分配器的容器要求)的相关部分是:

+-----------+-------------+--------------------------------+------------+
|Expression | Return type |   Assertion/note               | Complexity |
|           |             | pre-/post-condition            |            |
|-----------+-------------+--------------------------------+------------+
|   a = t   |      X&     | Requires: T is CopyInsertable  | linear     |
|           |             | into X and CopyAssignable.     |            |
|           |             | post: a == t                   |            |
+-----------+-------------+--------------------------------+------------+

然后§23.2.4[associative.reqmts] / p7说

关联容器满足分配器感知容器的所有要求(23.2.1),除了对于mapmultimap ,表96中对value_type的要求适用于key_typemapped_type [ :例如,在一些情况下key_typemapped_type需要是CopyAssignable即使相关value_typepair<const key_type, mapped_type>是不是CopyAssignable 尾注 ]

请注意,此表引用了表96,但要注意的是,该表显然也要涵盖表99,因为表96中的任何内容实际上都不需要CopyAssignable 由于value_typepair<const key_type, mapped_type>永远不是CopyAssignable ,因此阅读表99要求来引用它是相当荒谬的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM