gpt4 book ai didi

C++ 引用可以赋值吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:11 24 4
gpt4 key购买 nike

我一直在处理包装在容器类中的引用。为什么以下代码是合法的并且看起来行为正确?

#include <iostream>

class Foo
{
public:
Foo( int i ) : i_( i ) {}
int i_;
};

class FooWrapper
{
public:
FooWrapper( Foo& foo ) : foo_( foo ) {}
Foo& foo_;
};

int main( int argc, char* argv[] )
{
Foo foo( 42 );
FooWrapper fw( foo );
FooWrapper fw2 = fw;
std::cout << fw2.foo_.i_ << std::endl;
return 0;
}

在没有显式 operator= 的情况下,我相信 C++ 会进行成员复制。因此,当我执行 FooWrapper fw2 = fw; 时,这不是两个操作:(1) 创建 FooWrapper fw 使用默认构造器,然后是 (2) 来自 的赋值fwfw2?我敢肯定这不会发生,因为无法在未初始化的情况下创建引用,所以 fw2 的创建实际上是否被视为复制构造?

我有时不清楚复制构造与赋值的作用;它们有时似乎会相互渗透,就像这个例子一样,但可能有一些我不知道的规则。如果您能给我解释,我将不胜感激。

最佳答案

尽管语法中有 =FooWrapper fw2 = fw; 复制构造 fw2(使用复制构造函数)。根本不涉及默认构造和赋值。

并回答标题中的问题:不,不能分配引用。如果您编写的代码试图实际默认构造或分配 FooWrapper,例如:

FooWrapper fw2;
fw2 = fw;

...这会失败。正式地,只需要“诊断”。非正式地,我知道的每个编译器都会/将拒绝编译它。

关于C++ 引用可以赋值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45500842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com