在构造函数期间调用哪个运算符分配给 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
引用相同的对象。 没有复制。
当我调用一个将传递的 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
引用相同的对象。 没有复制。