Как уже упоминалось в комментариях, unique
без std::
работает из-за аргумент-зависимого поиска.
v.begin()
и v.end()
return std::vector<int>::iterator
, что является некоторым итератором для std::vector<int>
. Это может быть любой тип, удовлетворяющий требованиям итератора. Это может быть простой указатель на int
или, что более вероятно, на класс с перегруженными операторами.
Если итератор является типом класса, тогда поиск по аргументу будет искать unique
в этом классе и в классах, включающих его. область имен Если в этом объеме области имен входит ::std
, то будет найден и использован ::std::unique
.
Нет гарантии, что это работает. Это зависит от реализации стандартной библиотеки, будет ли это или нет.
Например, с std::array
вместо std::vector
он работает на MSV C, но не на Clang (с libc ++) или G CC (с libstdc ++), поскольку последние два просто используют int*
в качестве итератора, см. https://godbolt.org/z/Ysu2-d.
Вы всегда должны ссылаться на std::unique
с его полным именем.