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

gon*_*ing 5 c++ c++11 clang++

它似乎在这里建议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 );
}
Run Code Online (Sandbox Code Playgroud)

上面用GCC 4.9和Visual Studio 2013进行编译但失败了,抱怨缺少赋值运算符,在Ubuntu 14.10框上使用clang 3.5运行以下命令"clang ++ -std = c ++ 11 -stdlib = libc ++ code.cpp ".使用GCC标准库时,Clang确实成功了.我怀疑clang标准库在这里被打破了.

T.C*_*.C. 4

\xc2\xa723.1 [container.requirements.general]/p15 & 表 99:

\n\n
\n

在表 99 中,X表示分配器感知容器类,\n value_type表示T使用类型 的分配器Au\n 表示变量, \ anb表示类型 的非常量左值Xt\n 表示类型 的左值或常量右值Xrv表示 a \n 类型 的非常量右值X,并且m是类型 的值A

\n
\n\n

表 99(分配器感知容器要求)的相关部分是:

\n\n
+-----------+-------------+--------------------------------+------------+\n|Expression | Return type |   Assertion/note               | Complexity |\n|           |             | pre-/post-condition            |            |\n|-----------+-------------+--------------------------------+------------+\n|   a = t   |      X&     | Requires: T is CopyInsertable  | linear     |\n|           |             | into X and CopyAssignable.     |            |\n|           |             | post: a == t                   |            |\n+-----------+-------------+--------------------------------+------------+\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后 \xc2\xa723.2.4 [associative.reqmts]/p7 说

\n\n
\n

关联容器满足分配器感知容器 (23.2.1) 的所有要求,但对于mapmultimap,表 96 中的要求value_type适用于key_typemapped_type。[注意:例如,在某些\n 情况下,key_typemapped_type需要为CopyAssignable\n,即使关联的value_type, pair<const key_type, mapped_type>, 不是CopyAssignable。\xe2\x80\x94尾注]

\n
\n\n

请注意,这引用了表 96,但考虑到该注释,其意图显然也涵盖表 99,因为表 96 中实际上没有任何要求CopyAssignable。由于value_type, pair<const key_type, mapped_type>, 从来不是CopyAssignable,阅读表 99 的要求来引用它是相当荒谬的。

\n