以下代码编译失败,这很奇怪:
#include <iostream>
#include <queue>
using namespace std;
struct Node {
char data;
Node* next;
Node(char c, struct Node* nptr = nullptr)
: data(c), next(nptr) {}
};
struct NodeCmp {
bool operator()(const Node*& lhs, const Node*& rhs) const {
return lhs->data > rhs->data;
}
};
int main() {
priority_queue<Node*, vector<Node*>, NodeCmp> PQ;
return 0;
}
有错误:
prog.cpp:13:10: note: conversion of argument 2 would be ill-formed:
In file included from /usr/include/c++/5/bits/stl_algobase.h:71:0,
from /usr/include/c++/5/bits/char_traits.h:39,
from /usr/include/c++/5/ios:40,
from /usr/include/c++/5/ostream:38,
from /usr/include/c++/5/iostream:39,
from prog.cpp:1:
/usr/include/c++/5/bits/predefined_ops.h:123:46: error: invalid initialization of non-const reference of type 'const Node*&' from an rvalue of type 'const Node*'
{ return bool(_M_comp(*__it1, *__it2)); }
^
请参阅此IDE一个链接:http://ideone.com/T2ST03
但是,使用模板的以下内容很好:
#include <iostream>
#include <queue>
using namespace std;
struct Node {
char data;
Node* next;
Node(char c, struct Node* nptr = nullptr)
: data(c), next(nptr) {}
};
template <class T>
struct NodeCmp {
bool operator()(const T& lhs, const T& rhs) const {
return lhs->data > rhs->data;
}
};
int main() {
priority_queue<Node*, vector<Node*>, NodeCmp<Node*>> PQ;
return 0;
}
请参阅IDE一个链接:http://ideone.com/xPcNFK
我想了解这是怎么发生的,为什么在C ++中这样呢?感谢。
答案 0 :(得分:2)
这是指向const Node
指针的(非常量左值)引用:
const Node*& lhs
非const左值引用无法绑定到标准C ++中的临时值。这是编译器错误的原因。最简单的解决方法是根本不传递引用:
bool operator()(const Node* lhs, const Node* rhs) const
它与模板示例一起使用的原因是,对于T = Node*
,const T&
解析为const
对Node*
的引用。
答案 1 :(得分:2)
const T&
T = Node*
Node* const&
为const Node*&
,而不是Node * const& p
:
Node
是指向非const const Node*&
的指针的 const引用,即您无法修改它,但是你可以修改它指向的内容。
Node
是指向 const bool operator()(const Node* lhs, const Node* rhs) const
的指针的非const引用,即您可以修改指针,但不是它指的是什么。
如果您知道自己正在处理指针,请不要使用引用:
$n