Archive for August, 2017

stl 中 std::for_each 源码分析

1 缘起:以下代码在经过msvc的debug模式编译时报错,但换成release模式时则顺利通过编译。

1)编译器环境:Microsoft Visual Studio Community 2015

Version 14.0.25424.00 Update 3

2)代码:

3)报错:

4) 分析代码调用(debug模式下):

a)std::for_each:

a.1) _DEBUG_RANGE_PTR(_First, _Last, _Func);

a.1.1) _DEBUG_RANGE_PTR_IMPL(first, last, ptr, _FILENAME, __LINE__)

a.1.1.1) _Debug_range_ptr

至此出现错误,原因是当实例化类_Iter_cat_t<_InIt>()时,由于iterator_traits<_Iter>以及_Iterator_traits_base<_Iter>均为空基类,并没有iteator_category的定义,所以报错。

5)当设置成release的时候:

上面代码分析中a.1的代码变成如下:相当于不做任何事情

对于_ITERATOR_DEBUG_LEVEL :

因此,在没有定义_DEBUG宏的情况下,编译器是不会对迭代器的iterator_category进行检查.

 

2 在ubuntu64位机器上的gcc5.4.0使用一样的代码也出现相同的情况,在定义宏_GLIBCXX_DEBUG的情况下,报出如下错误,注意倒数第四行,错误的原因与在windows下相似,因为gcc编译器默认没有定义宏_GLIBCXX_DEBUG,所以对于不标准(表不标准取决于是否使用stl算法,包括std::for_each)的迭代器不进行检查。