无法从'unsigned int'转换为'unsigned int&'

时间:2014-03-04 04:56:20

标签: c++ c++11

我正在创建一个方法,该方法的一个参数要求引用unsigned int,但我想在该参数上放置一个默认值。例如:

#include <iostream>

using namespace std;

class A {
public:
    void sender();
private:
    unsigned int score = 10;
};

class B {
public:
    void receiver(unsigned int & score);
};

void A::sender() {
    cout << "Before: " << score << endl;
    B b;
    b.receiver(score);
    cout << "After: " << score << endl;
}

void B::receiver(unsigned int & score) {
    score = 100;
}

int main() {
    A a;
    a.sender();
    return 0;
}

现场演示:in here

执行此操作时会发生错误:

void receiver(unsigned int & score = 10u);

编译器返回:

  

错误:无法将'10'从'unsigned int'转换为'unsigned int&amp;'

现场演示:in here

3 个答案:

答案 0 :(得分:4)

您不能将文字 1 分配给非const引用。

有两种情况可以满足您的需求:

您打算修改传递给receiver()

的参数

如果是这种情况,则使用非const引用(unsigned int & score而不使用默认参数。在将文字或临时对象传递给它的情况下,它将导致编译器错误。

a.receiver(10);  // Error

考虑到你想要修改那个参数,上面没有多大意义(如果C ++允许 2 ,你就不会看到修改。)

您打算以只读方式使用该参数

只使用普通的,非引用的unsigned int,因为const unsigned int& score只是一种痛苦。如果您确定某个对象的复制成本很高,那么您应该将该参数设置为const引用。

更新某些个案件您要修改某些内容,但有些内容可能存在,也可能不存在。在这种情况下,您可能希望使用非拥有指针作为参数。

   // Declaration
   void receiver(unsigned int* score = nullptr);

void B::receiver(unsigned int* score) {
    if(score) *score = 100;
}

...

a.receiver();    // Uses the default parameter

unsigned int x;
a.reciever(&x);

在这种情况下,它仅在指向某个(假定的)有效变量时分配给score。指针并没有那么糟糕。

更新2: 然而,如@Potatoswatter have pointed out,您可能最好使用功能重载。

void B::receiver() {
    // Do something else
}

void B::receiver(unsigned int& score) {
    score = 100;
}

如果您希望重载在不同参数上的表现不同,则应使用此方法。

然而,我更喜欢第一个非默认参数选项,而不是指针选项和重载选项,因为要求调用者提供参数,这在你做得更好通过函数修改某些东西。

更新3:您还应该考虑让函数返回值,而不是通过参数修改它。如果您不需要修改对象的当前状态,则让函数返回值更加直观。但需要注意的是,调用者可能忘记捕获(分配)返回值,如果您使用该值作为某些资源ID来释放某些内容,这可能会很危险。


1 一般来说,是一个临时对象。

2 宇宙可能blow up如果10被神奇地转化为100;)

答案 1 :(得分:2)

您希望参数类型为const unsigned int&。否则,你可以做一些疯狂的事情,比如尝试分配10 = 20,这是没有意义的。

这恰好就是你所做的。 score = 100行似乎不是你的实际含义。

答案 2 :(得分:1)

值“10”不是参考 - 它是一个值。通过使用by-reference参数,必须使用引用调用它。使用默认参数意味着您可以在不指定参数的情况下调用函数,编译器将使用默认值。

同样,调用b.receiver(10);无效,但

int someInt = 10;
b.receiver(someInt);

有效。