如何将运算符=与引用一起使用

How to use operator= with a reference

本文关键字:引用 一起 运算符      更新时间:2023-10-16

下面的代码涉及问题Error重载运算符中似乎不一致的行为=在已回答的变量定义中使用。我的问题是在试图使用整数定义和初始化对结构的引用的上下文中提出的。

所以我不需要写"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:错误:"S&"类型的非常量引用的初始化无效从'int'类型的右值(关于s6)。

首先,您不是在使用operator=,而是一个复制初始化

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

更进一步,不能使用S& s1 = 3;,不是因为不能将3分配给引用,而是因为分配的右侧是R-VALUE(即是临时)。然而,您可以使用对l-value的const引用来延长其使用寿命,因为r-value非常喜欢被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);

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

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

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