当我调用一个将传递的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
的哪些内容(如果有的话)?
答案 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){}
};