在构造函数(re. noexcept)期间调用哪个操作符来赋值给const引用

Which operator is called to assign to const reference during constructor (re. noexcept)

本文关键字:操作符 赋值 引用 const 调用 re 构造函数 noexcept      更新时间:2023-10-16

当我调用将传递的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_;
};