(我之前问过这个问题,但没有给出一个可行的例子,所以我删除了前一个。我希望在这个问题上我得到了正确的例子。)
案子:
#include <iostream>
struct S
{
S() = default;
S(const S &)
{
std::cout << "Copying" << std::endl;
}
S& operator=(const S &)
{
std::cout << "Copy assignment" << std::endl;
return *this;
}
};
int main()
{
S s{};
S s2{};
S &ref = s;
ref = s2;
}
据我了解,ref = s2;
包括 l2r 转换,因为它是每个 cppreference 期望的“内置直接分配”,并且右值作为其正确的参数。
我已经阅读了一些关于左值到右值转换的 SO 问题,但我仍然不确定它是否涉及对象的复制,如果涉及,它是哪种复制。
假设我们正在谈论类类型。
来自 [conv.lval]/2:
否则,如果 T 具有类类型,则转换从泛左值复制初始化 T 类型的临时,并且转换的结果是临时的纯右值。
因此,作为左值到右值转换的一部分,涉及到复制初始化。
因此,以用户定义的复制构造函数为例ref = s2;
,例如打印“Copying”,在上述语句的执行过程中会打印“Copying”吗?
嗯,显然不会。但这意味着我在这里误解了一些东西。
左值到右值转换期间的复制初始化是否类似于普通的 memcpy 而不是完全意义上的复制初始化?
这一切是如何运作的?:)