突然在this article ("problem 2")我看到一条声明,如果该类有一个过载的operator&()
,C ++标准禁止使用STL容器来存储类的元素。
重载operator&()
can indeed be problematic,但看起来像默认的“address-of”运算符,可以通过a set of dirty-looking casts that are used in boost::addressof()
轻松使用,并且被认为是便携式和标准兼容的。
为什么在operator&()
解决方法存在的情况下,存储在STL容器中的类禁止重载boost::addressof()
?
答案 0 :(得分:6)
在没有查看链接的情况下,我认为boost::addressof()
中的技巧是在要求不要为std lib的容器中保存的对象重载一元前缀&
之后发明的。
我依旧记得Pete Becker(当时正在为Dinkumware工作的标准库实现)曾经说过,每个重载地址运算符并希望他们的标准库实现仍然有效的人应该受到必须实施标准库的惩罚。做这个。
答案 1 :(得分:2)
可能因为禁止使用重载的operator&()类而不是创建std :: addressof()函数并替换&的每次使用都不那么麻烦。在容器代码中。
答案 2 :(得分:1)
该标准于1998年定稿,2003年修订,而2002年初为boost::addressof
dates to。
此外,addressof
是答案并不清楚。 operator&()
的重载表明应该避免使用原始指针。 Allocator::address
成员提供了从Allocator::reference
到Allocator::pointer
的最佳界面,因此在一般理论中,您应该能够有效介绍 {{1}使用自定义分配器覆盖一个行为良好的类。
考虑到引用几乎完成指针的所有操作,并且Allocator接口抽象其他所有内容,因此不需要原始指针。
图书馆实施者的便利应该不是问题。 operator&
的定义不明确的语义是一个问题,到目前为止我在C ++ 0x中读到的内容并不清楚。
C ++ 0x删除了CopyConstructible中对Allocator::pointer
的任何提及,而且不需要任何东西 - 容器参数可构造 - 用户可以坚持operator&
。即使emplace
只需要可破坏,但我认为实际使用vector
或insert
需要更多。
(请注意,在最严格的阅读中,C ++ 03中不禁止重载。您不能更改内置的值或类型。)