Вчера я столкнулся с проблемой, которую я окончательно переделал в следующий минимальный пример.
#include <iostream>
#include <functional>
int main()
{
int i=0, j=0;
std::cout
<< (&i == &j)
<< std::less<int *>()(&i, &j)
<< std::less<int *>()(&j, &i)
<< std::endl;
}
Эта конкретная программа при компиляции с использованием MSVC 9.0 с включенными оптимизациями выводит 000
. Отсюда следует, что
- указатели не равны, а
- ни один из указателей не упорядочен перед другим в соответствии с
std::less
, подразумевая, что два указателя равны в соответствии с полным порядком, налагаемымstd::less
.
Правильно ли это поведение? Не требуется ли полный порядок std::less
быть связан с оператором равенства?
Разрешено ли следующей программе выводить 1
?
#include <iostream>
#include <set>
int main()
{
int i=0, j=0;
std::set<int *> s;
s.insert(&i);
s.insert(&j);
std::cout << s.size() << std::endl;
}