如何将运算符=与引用一起使用
How to use operator= with a reference
下面的代码涉及问题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);
相关文章:
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 为什么引用不能与编译时函数一起使用?
- 与引用一起使用的列表,在用作成员时更改行为
- 我是否需要将 ref 与 make_pair 一起使用才能返回引用?
- 将shared_ptr与常量引用一起使用
- 是否可以将引用类型别名与指针运算符一起使用来声明对指针的引用?
- 当它们不与GCC和CMAKE一起使用时,如何解析未定义的引用
- 重值引用不是将类型和类别混合在一起吗?
- 使用C和C 一起使用函数错误的不确定引用
- 什么时候可以将"typename"与明确引用类型的标识符一起使用?
- 为什么引用和指针不能一起使用?
- 如何将初始值设定项与右值引用参数一起使用 // 为什么不能使用另一个 C 样式数组变量初始化 C 样式数组
- 尝试实现通过引用传递的向量以与二叉树一起使用,我错过了什么
- 将模板类与引用非类型模板参数一起使用时出现链接器错误
- 将push_back与右值引用一起使用
- 使用 Visual Studio 创建的静态库在与代码块一起使用时显示对 Myfunction 的未定义引用
- 如何使模板类型的推导与引用一起工作
- 如何将相互依赖的对象移动到一起并维护内部引用
- C++中的多态性不能与引用一起正常工作
- 如何将运算符=与引用一起使用