以下代码与已回答的问题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)。
答案 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);