我正在研究C ++,并且出现了一个我不知道确切原因的错误。我找到了解决方案,但仍然想知道原因。
class Base
{
public:
void something(Base& b){}
};
int main()
{
Base b;
b.something(Base());
return 0;
}
当我编译代码时,我得到以下错误:
abc.cpp:12:20: error: no matching function for call to ‘Base::something(Base)’
abc.cpp:12:20: note: candidate is:
abc.cpp:6:7: note: void Base::something(Base&)
abc.cpp:6:7: note: no known conversion for argument 1 from ‘Base’ to ‘Base&’
但是当我将b.something(Base())替换为
时Base c;
b.something(c);
错误消失了,我想知道为什么???不是他们有相同的类型?它只是我写它的方式,但意思应该是相同的???
谢谢大家!
答案 0 :(得分:41)
您正在此处传递一个临时Base
对象:
b.something(Base());
但是你试着将它绑定到非const左值引用:
void something(Base& b){}
标准C ++中不允许这样做。您需要const
参考。
void something(const Base& b){}
执行此操作时:
Base c;
b.something(c);
你不是临时的。非const引用绑定到c
。
答案 1 :(得分:2)
在第一种情况下,您尝试将(非常量)引用传递给临时as参数到函数,这是不可能的。在第二种情况下,您传递对完全有效的现有对象的引用。