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

C++ 如何将运算符=与引用一起使用,c++,C++,下面的代码与已回答的问题有关。 我的问题是在试图使用整数定义和初始化对结构的引用的上下文中提出的 所以我需要的不是写“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;

下面的代码与已回答的问题有关。 我的问题是在试图使用整数定义和初始化对结构的引用的上下文中提出的

所以我需要的不是写“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”类型的右值(关于s6)初始化“S&”类型的非常量引用无效。

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


首先,您使用的不是
操作符=
,而是复制初始化

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

更进一步,您不能使用
S&s1=3不是因为无法将3赋值给引用,而是因为赋值的右侧是一个R值(即临时值)。但是,您可以使用const-reference将其生存期延长到l-value,因为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
告诉您,如果不初始化变量,就不能创建作为引用(与指针相反)的变量

但是如果您有一个有效初始化的引用,那么无论何时使用赋值,只有
操作符=
才会被调用:

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

S&s1=3
没有真正意义,因为它会导致超出范围的匿名临时文件悬空。
S s1=3不使用
运算符=
。你的重载至少应该返回正确的类型;必须初始化对
S
的引用,以引用类型为
S
的现有对象。你为什么认为你需要这样做?@MikeSeymour真正的问题是我有一个S数组(sa[0x10]),通过写S&s6=5,我想说的是S&s6=A[5];我能做到吗?@GeorgeKourtis:那么写
S&s6=A[5],如果你想说的话。数字
5
不可能表示
A[5]
s s1=3表示
s1=S(3),因此与
s1(3)相比存在“开销”。可以省略临时类,但该类必须仍然具有可访问的复制/移动构造函数此处有一个显示需要复制构造函数的实例,称为复制省略。这也是为什么不能调用显式构造函数的原因(临时对象
S(3)
必须调用隐式构造函数,因为该对象没有显式初始化)
main.cpp:16:5: error: ‘s5’ declared as reference but not initialized
S s1(1);
S& s1ref = s1;
S s2(2);
s1ref = s2; // s1.operator=(s2);