在构造函数期间调用哪个运算符分配给 const 引用(re.noexcept)

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

当我调用一个将传递的 const & 分配给 const & 成员变量的构造函数时,会发生什么?由于 const ref,我的理解是 'very little' - 没有复制、移动、调用的构造函数等 - 只是复制可能变成指针的东西。

例如

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,我需要了解 [=16= 什么(如果有的话) ]?

我相信下面的作业应该是安全的;我不相信你能保证引用在赋值后仍然是 "valid",但赋值应该是安全的。如果您担心引用无效,您可能需要在此处使用 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_;
};

int i;
int &r = i;

r = i 不是一个赋值,它是一个初始化。参考行为类似于 "alias":r 将表现为 i.

您不能分配引用,只能分配它们的指称:

r = 2; // same as i = 2

这里:

class ClassB
{
    const ClassA &classRef_;
public:
    ClassB(const ClassA& a):classRef_(a){}
};

在构造函数中,表达式 a 指定一个 ClassA 对象(具有常量左值)。

:classRef_(a) 表示 "initialise the member reference classRef_ so that it becomes an alias for the object designated by a".

新引用 classRef_ 将引用与 a 引用相同的对象。 没有复制。