Значение итератора передается как подсказка позиции к std::set::insert(iterator position, const value_type& val)
и std::multiset::insert(iterator position, const value_type& val)
изменениям между С++ 98 и С++ 11. Есть ли простой способ во время компиляции обнаружить, что используется и использовать другой код
Общая проверка на С++ 11 не кажется хорошей идеей (1, 2), и я не видел подходящего макроса Boost.Config.
В частности, документация для С++ 98 говорит:
Функция оптимизирует время вставки, если позиция указывает на элемент, который будет предшествовать вставленному элементу.
а для С++ 11 он говорит:
Функция оптимизирует время вставки, если позиция указывает на элемент, который будет следовать вставленному элементу (или до конца, если он будет последним).
Это важно, потому что подсказка влияет на сложность вызова вставки. Если подсказка верна, сложность - это только амортизированная константа. Но если это не так, оно логарифмическое по размеру.
Update
Как хорошо описано ниже JerryCoffin, спецификация С++ 98, по сути, является опечаткой.