繁体   English   中英

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

[英]Does std::less have to be consistent with the equality operator for pointer types?

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

#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强加的总顺序相等。

这种行为是否正确? 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;
}

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

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

对于templates,less,greater_equal和less_equal,任何指针类型的特化都会产生一个总顺序,即使内置运算符<,>,<=,> =也不行。

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

编辑: C ++ 0x也保持这个低于20.8.5 / 8

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

遵循5.10 / 1 C ++ 03:

相同类型的两个指针比较相等,当且仅当它们都为空时,都指向相同的函数,或者两者都表示相同的地址

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

不,结果显然不正确。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM