C++03标准中的几处缺陷

原文:http://blogs.msdn.com/xiangfan/archive/2008/08/30/conformance-macros-in-vc-stl.aspx

在VC的STL实现中,有两个宏"_HAS_IMMUTABLE_SETS"和"_HAS_STRICT_CONFORMANCE"(它们在yvals.h中定义)。这两个宏和C++03标准的几处缺陷有关。

1. _HAS_IMMUTABLE_SETS影响set::iterator是否是constant iterator

关联容器要求它的元素是有序的,因此通常修改这些元素的内容非常危险。但是C++03中并没有禁止程序员这么做。

在C++0x中,对关联容器的iterator加入了下述要求:

For associative containers where the value type is the same as the key type, both iterator and const_iterator are constant iterators(在标准中,是这样描述constant iterator:Constant iterators do not satisfy the requirements for output iterators, and the result of the expression *i (for constant iterator i) cannot be used in an expression where an lvalue is required)

这意味着C++0x中你再也不能通过iterator来修改关联容器中的元素的内容了。

讨论:http://www.cpptalk.net/image-vp135370.html

2. _HAS_STRICT_CONFORMANCE会对以下两处产生影响:

a. 对关联容器,它们的erase成员函数的声明有如下的改变

void erase(const_iterator position);
size_type erase(const key_type& x);
void erase(const_iterator first, const_iterator last);

->

iterator erase(const_iterator position);
size_type erase(const key_type& x);
iterator erase(const_iterator first, const_iterator last);

在C++03中,关联容器的erase没有返回值,这和序列容器是不一致的。C++0x修正了这个缺陷。
VC的扩展默认遵守C++0x的规定,即erase将返回iterator。 _HAS_STRICT_CONFORMANCE将禁用这一扩展.

讨论:http://www.tech-archive.net/Archive/VC/microsoft.public.vc.stl/2005-10/msg00030.html

进一步的讨论:http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#103

b. For codecvt::do_length(stateT& state, const externT* from, const externT* from_end, size_t max) const;

在C++03中,要求codecvt<wchar_t, char, mbstate_t>和codecvt<char, char, mbstate_t>的do_length函数返回max和(from_end-from)中较小的值.
C++0x放宽了这一要求,仅codecvt<char, char, mbstate_t>需要这样做。

BTW:VC的STL实现是由Dinkumware公司提供的。你可以在每个STL头文件的最后找到"P.J. Plauger"的字样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值