它似乎在这里建议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标准库在这里被打破了.
\xc2\xa723.1 [container.requirements.general]/p15 & 表 99:
\n\n\n\n\n在表 99 中,
\nX表示分配器感知容器类,\nvalue_type表示T使用类型 的分配器A,u\n 表示变量, \anb表示类型 的非常量左值X,t\n 表示类型 的左值或常量右值X,rv表示 a \n 类型 的非常量右值X,并且m是类型 的值A。
表 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+-----------+-------------+--------------------------------+------------+\nRun Code Online (Sandbox Code Playgroud)\n\n然后 \xc2\xa723.2.4 [associative.reqmts]/p7 说
\n\n\n\n\n关联容器满足分配器感知容器 (23.2.1) 的所有要求,但对于
\nmap和multimap,表 96 中的要求value_type适用于key_type和mapped_type。[注意:例如,在某些\n 情况下,key_type和mapped_type需要为CopyAssignable\n,即使关联的value_type,pair<const key_type, mapped_type>, 不是CopyAssignable。\xe2\x80\x94尾注]
请注意,这引用了表 96,但考虑到该注释,其意图显然也涵盖表 99,因为表 96 中实际上没有任何要求CopyAssignable。由于value_type, pair<const key_type, mapped_type>, 从来不是CopyAssignable,阅读表 99 的要求来引用它是相当荒谬的。
| 归档时间: |
|
| 查看次数: |
231 次 |
| 最近记录: |