关于c ++转换:参数1从'[some_class]'到'[some_class]&'没有已知的转换

时间:2013-11-27 16:14:52

标签: c++

我正在研究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);

错误消失了,我想知道为什么???不是他们有相同的类型?它只是我写它的方式,但意思应该是相同的???

谢谢大家!

2 个答案:

答案 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参数到函数,这是不可能的。在第二种情况下,您传递对完全有效的现有对象的引用。