如何使用operator = with reference

时间:2014-08-26 13:06:28

标签: c++

以下代码与已回答的问题Error seemingly inconsistent behaviour in overloaded operator= used in variable definition有关。 在尝试使用整数定义和初始化对结构的引用的上下文中,我的问题很复杂。

所以我需要而不是写作" S s1 = 3;"我需要写" S& S1 = 3;"我将如何管理它;

struct S{
    int a,b;
    void operator=(int x){a=x;b=x*x;}
    S(){};
    S(int x){a=x;b=x*x;}
};

int main(){
    S s1;s1=5;
    S s2;s2=7;
    S s3=9;
    S s4;
}

main()的代码应该修改如下:

int main(){
    //S s0=S{15,20};
    S s1;s1=5;
    S s2;s2=7;
    S s3=9;
    S s4;

    S& s5;s5=10;
    S& s6=10;
}

但是编译我有错误:

main.cpp:16:5:错误:'s5'声明为引用但未初始化

main.cpp:17:8:错误:从'int'类型的右值开始无效初始化'S&'类型的非const引用(关于s6)。

2 个答案:

答案 0 :(得分:3)

首先,您没有使用operator=,而是复制初始化

即表达式S s1 = 3;使用非显式构造函数S(int x)以及非显式可访问复制构造函数S(const S& x)(希望没有任何额外的开销)。

更进一步,你不能使用S& s1 = 3;,因为你不能将3分配给引用,但因为赋值的右边是R-VALUE(即< em>临时)。但是,您可以使用const引用将其生命周期延长到l值,因为r值非常类似于const l-value引用:

const S& s1 = 3;

只要S(int x)未标记为explicit,就会有效。

或者,(你根本不应该这样做),你可以使用r值引用:

S&& s1 = 3; // implicitly
S&& s2 = S(3); // explicitly

您看到尝试编译S& s5;的错误:

main.cpp:16:5: error: ‘s5’ declared as reference but not initialized

告诉你,你不能只创建一个引用的变量(而不是指针),而不是初始化它。

但是如果你有一个有效的初始化引用,那么每当你使用赋值时,只会调用operator=

S s1(1);
S& s1ref = s1;
S s2(2);
s1ref = s2; // s1.operator=(s2);

答案 1 :(得分:1)

这是不可能的;引用必须引用一个对象。您可以执行以下任一操作(使用C ++ 98语法):

S const &s1 (3);   // same as S const &s1 = S(3);

S s0(3); S &s1(s0);