gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:00:48 25 4
gpt4 key购买 nike

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

#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;
}

最佳答案

似乎我们有一个标准违规行为! panic !

在 20.3.3/8 (C++03) 之后:

For templates greater, less, greater_equal, and less_equal, the specializations for any pointer type yield a total order, even if the built-in operators <, >, <=, >= do not.

似乎急切的优化会导致不正确的代码...

编辑: C++0x 也将这个保存在 20.8.5/8 之下

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

5.10/1 C++03 之后:

Two pointers of the same type compare equal if and only if they are both null, both point to the same function, or both represent the same address

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

关于c++ - std::less 是否必须与指针类型的相等运算符一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5322227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com