std :: less是否必须与指针类型的相等运算符一致?

时间:2011-03-16 07:31:46

标签: c++ pointers

昨天我遇到了一个问题,我最终将其提炼成以下最小例子。

#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。这意味着

  1. 指针不相等,
  2. 根据std::less,两个指针都没有在另一个之前排序,这意味着两个指针根据std::less强加的总顺序相等。
  3. 这种行为是否正确? 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;
    }
    

2 个答案:

答案 0 :(得分:11)

似乎我们有标准的违规行为!恐慌!

遵循20.3.3 / 8(C ++ 03):

  

对于模板更大,更少,   greater_equal和less_equal ,.   任何指针类型的特化   即使产生总订单   内置运算符&lt;,&gt;,&lt; =,&gt; = do   不

这似乎是一种急切优化导致代码不正确的情况......

编辑: C ++ 0x也将此版本保持在20.8.5 / 8

之下

编辑2:奇怪的是,作为对第二个问题的回答:

遵循5.10 / 1 C ++ 03:

  

相同类型的两个指针比较   当且仅当他们两者都是平等的   null,都指向相同的函数,   或两者代表相同的地址

这里出了点问题...在很多层面上。

答案 1 :(得分:0)

不,结果显然不正确。

但是,众所周知,MSVC不遵循该字母的“唯一地址”规则。例如,它合并了恰好生成相同代码的模板函数。那些不同的功能也将具有相同的地址。

我想你的例子如果你真的为我和j做了一些事情会更好,其他的就是他们的地址。