gpt4 book ai didi

c++ - 类类型的左值到右值转换 : is there copying involved?

转载 作者:行者123 更新时间:2023-11-28 04:49:40 25 4
gpt4 key购买 nike

(我之前问过这个问题,但没有给出一个可行的例子,所以我删除了之前的一个。我希望在这个问题上我得到了正确的例子。)

案例:

#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:

Otherwise, if T has a class type, the conversion copy-initializes a temporary of type T from the glvalue and the result of the conversion is a prvalue for the temporary.

因此,作为左值到右值转换的一部分涉及复制初始化。

ref = s2; 为例,使用用户定义的复制构造函数,例如打印'Copying',在执行上述语句时会打印'Copying'吗?

嗯,显然不会。但这意味着我在这里误解了一些东西。

左值到右值转换期间的复制初始化是否类似于普通的 memcpy 而不是完整意义上的复制初始化?

这一切是如何运作的? :)

最佳答案

As I understand, ref = s2; includes l2r conversion as it is a 'builtin direct assignment' that per cppreference expects and rvalue as its right argument.

你的错误在于解释这里的赋值运算符是一个内置的。它不是。唯一具有内置赋值运算符的类型是基本类型(指针、charint 等)。您拥有的是类类型,它具有重载赋值运算符(无论是用户提供的还是编译器隐式生成的)。

ref = s2; 只是调用 S::operator=(S const&)。它的行为就像您刚刚键入 ref.operator=(s2) 一样。在该函数的实现中没有左值到右值的转换,因此没有制作其他拷贝。所发生的只是该行被打印出来。没有额外的复制初始化等。

如果您以不同方式实现赋值运算符,如:

S& operator=(S /* no ref */) { return *this; }

然后将发生左值到右值的转换以实际调用此函数,并且您会看到您的复制构造函数被调用。

关于c++ - 类类型的左值到右值转换 : is there copying involved?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48493469/

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