2

当我调用一个将传递const &const &成员变量的构造函数时,会发生什么?由于 a 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);
}

特别是,如果我想声明 as 的函数(例如这里的构造函数),ClassBnoexcept需要知道什么(如果有的话)ClassA

4

2 回答 2

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没有复制。

于 2015-07-29T03:56:58.213 回答
0

我相信下面的任务应该是安全的;我不相信您可以保证引用在分配后仍然“有效”,但分配应该是安全的。如果您担心引用无效,您可能希望在此处使用 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_;
};
于 2015-07-29T03:36:35.787 回答