在构造函数中调用哪个运算符赋值给const引用(re.noexcept)

时间:2015-07-29 02:04:54

标签: c++ reference noexcept

当我调用一个将传递的const &分配给const &成员变量的构造函数时,会发生什么?自const ref以来,我的理解是“很少”。 - 没有复制,移动,构造函数等等 - 只是复制可能成为指针的东西。

E.g。

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的哪些内容(如果有的话)?

2 个答案:

答案 0 :(得分:2)

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引用相同的对象。 没有复制。

答案 1 :(得分:0)

我认为下面的任务应该是安全的;我不相信您可以保证在转让后参考仍然“有效”,但转让应该是安全的。如果您担心引用无效,则可能需要在此处使用weak_ptr。成员初始化是一个引用赋值(或复制,具体取决于您如何看待它)。如果引用是borked,您仍然可以复制引用。

desc.Value =""

为了使下面的noexcept,你应该复制构造函数nothrow;可能使用std :: swap(a,b):

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