Вчера я столкнулся с проблемой, которую я в конечном итоге привел к следующему минимальному примеру.
#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;
}