我昨天碰到了一个问题,我最终将其提炼成以下最小的例子.
#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;
}
Run Code Online (Sandbox Code Playgroud)
当使用启用了优化的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;
}
Run Code Online (Sandbox Code Playgroud)
Kor*_*icz 11
似乎我们有标准的违规行为!恐慌!
遵循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 并未严格遵守“唯一地址”规则。例如,它合并恰好生成相同代码的模板函数。那么这些不同的函数也将具有相同的地址。
我想如果你真的对 i 和 j 做了一些事情,除了获取他们的地址之外,你的例子会效果更好。
| 归档时间: |
|
| 查看次数: |
469 次 |
| 最近记录: |