std :: less <int>int,int可能得到错误的答案

问题描述

我正在学习Spl​​ayTree。当我编写代码时,标题中的内容会出错。这个错误出现在我的“ splay”方法中:

void splay(const KeyType& arg_key,Node*& tree)

此行:

if (key_less(arg_key,key(tree)))

我试图输出有关此行的消息,发现它总是得到“真实”答案

码:
std::cerr << "arg_key == " << arg_key << "; key(tree) == " << key(tree) << std::endl;
std::cerr << "key_less(arg_key,key(tree)) == " << key_less(arg_key,key(tree)) << std::endl;
std::cerr << "key_less(key(tree),arg_key) == " << key_less(key(tree),arg_key) << std::endl;
std::cerr << "typename of key_less == " << typeid(key_less).name() << std::endl;

输出

arg_key == 2; key(tree) == 8
key_less(arg_key,key(tree)) == 0
key_less(key(tree),arg_key) == 1
typename of key_less == struct std::less<int>

八卦树模板就是这样

template <typename KeyType,typename ValueType,typename KeyOfValue,typename Comparator = std::less<KeyType>> class SplayTree

我定义一个八卦树

struct GetKeyFromValue
{
    int operator()(int value)
    {
        return value;
    }
};
SplayTree<int,int,GetKeyFromValue,std::less<int>> tree;

当我将最后一个模板参数更改为

    struct Comparator
    {
        bool operator()(int lhs,int rhs)
        {
            return lhs < rhs;
        }
    };
    SplayTree<int,Comparator> tree;

它可以获得正确的答案:

arg_key == 2; key(tree) == 8
key_less(arg_key,key(tree)) == 1
key_less(key(tree),arg_key) == 0
typename of key_less == struct `int __cdecl main(void)'::`2'::Comparator

这是一个错误吗?

非常感谢您关注我的问题。

我真的很期待您的帮助。

P.S。 我的平台是Windows10 1909上的Visual Studio 2019 16.7.1。

解决方法

感谢@Peter!正如您所提到的,问题发生在key(tree)中。它的定义是

static const KeyType& key(Node* node_ptr) { return KeyOfValue()(node_ptr->value); }

在这种情况下,KeyOfValue是我不小心编写的类:

struct GetKeyFromValue
    {
        int operator()(int value)
        {
            return value;
        }
    };

将其更改为

struct GetKeyFromValue
    {
        const int& operator()(const int& value)
        {
            return value;
        }
    };

现在一切都很好。 我认为这个问题可能是key(tree)返回了const int&返回的对GetKeyFromValue::operator()(int)返回的临时值的引用?

感谢所有能读懂我的问题并且毫不犹豫地启发我的人。