在构造函数(re. noexcept)期间调用哪个操作符来赋值给const引用
Which operator is called to assign to const reference during constructor (re. noexcept)
当我调用将传递的const &
赋值给const &
成员变量的构造函数时,会发生什么?自const ref
以来,我的理解是"非常少"-没有复制,移动,构造函数调用等-只是复制可能成为指针的东西。
。
class ClassA
{
public:
ClassA(const double a):a_(a){}
const double a_;
};
class ClassB
{
const ClassA &classRef_;
public:
ClassB(const ClassA& a):classRef_(a){}
};
int main()
{
ClassA aObj(5.212);
ClassB bObj(aObj);
}
特别是,如果我想将ClassB
的函数(例如这里的构造函数)声明为noexcept
,那么我需要了解ClassA
的什么(如果有的话)?
In
int i;
int &r = i;
r = i
不是赋值,它是初始化。引用的行为类似于"别名":r
的行为将类似于i
。
不能赋值引用,只能赋值其引用:
r = 2; // same as i = 2
:
class ClassB
{
const ClassA &classRef_;
public:
ClassB(const ClassA& a):classRef_(a){}
};
在构造函数中,表达式a
指定一个ClassA
对象(左值为常量)。
:classRef_(a)
表示"初始化成员引用classRef_
,使其成为a
指定对象的别名"。
新的引用classRef_
将引用与a
引用相同的对象。没有复制
我相信下面的赋值应该是安全的;我不相信你能保证引用在赋值后仍然"有效",但是赋值应该是安全的。如果担心引用无效,可能需要在这里使用weak_ptr。成员初始化是引用赋值(或复制,取决于您如何看待它)。如果引用已失效,您仍然可以复制该引用。
class ClassB
{
const ClassA &classRef_;
public:
ClassB(const ClassA& a):classRef_(a){}
};
为了使下面的noexcept,你也应该使复制构造函数nothrow;可能使用std::swap(a,b):
class ClassA
{
public:
ClassA(const double a):a_(a){}
const double a_;
};
相关文章:
- c++中的重载赋值操作符
- c++类继承和赋值操作符
- 带引用类成员的赋值操作符
- 复制构造函数,赋值操作符重载
- c++派生类赋值操作符
- 通过调用Move赋值操作符实现Move构造函数
- 带有映射的赋值操作符
- 单参数构造函数和赋值操作符
- 如何从复制赋值操作符调用复制构造函数
- c++复制构造函数,重载赋值操作符,方法get()
- 用于具有const数据成员的类的move和右值赋值操作符
- 类赋值操作符和复制构造函数
- 赋值操作符重载
- 影响正确性的move构造函数/赋值操作符示例
- 当类是子类时重载赋值操作符
- 如果没有定义Move语义(Move构造函数和Move赋值操作符),编译器是否默认优化
- 在类赋值操作符函数中,为什么必须返回*this ?
- 模板类的重载赋值操作符
- 模板操作符赋值重载未被调用
- 转换操作符(赋值操作符=)没有响应