If _EWL_RAW_ITERATORS is defined, vector and string will use pointers for their iterators, otherwise they will use classes. The difference can effect argument dependent (Koenig) lookup in some cases. For example:
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> v1(10), v2(10);
copy(v1.begin(), v1.end(), v2.begin());
}
This compiles if the iterators are classes ( _EWL_RAW_ITERATORS undefined). But if the iterators are simply pointers, a compile time error results:
Error : undefined identifier 'copy'
To fix this code so that it works with either setting, add a std qualifier to copy:
std::copy(v1.begin(), v1.end(), v2.begin());
The default configuration is for _EWL_RAW_ITERATORS to be undefined. There is no code size or run time overhead for this configuration (with inlining turned on). If you use _EWL_DEBUG (a configuration that does extensive run time checking when using the STL), then behavior is consistent with a _EWL_RAW_ITERATORS undefined setting, since the use of _EWL_DEBUG also forces vector and string iterators to be classes. Therefore the behavior of your application is less likely to change when switching between debug and release builds.