gpt4 book ai didi

c++ - 以下 3 种定义对象的方法是否相同?

转载 作者:行者123 更新时间:2023-12-03 06:50:54 26 4
gpt4 key购买 nike

据我了解,以下是相同的:

Person p{}; // Case 1
Person p = {}; // Case 1.5
我注意到
Person p = Person{}; // Case 2
产生与 Case 1 相同的跟踪输出和 Case 1.5多于。
  • 问题 1:将案例 2 与案例 1 或案例 1.5 进行比较,是因为复制省略还是其他原因?
  • 问题2:以下有什么区别?
  • Person p{};            // Case 1
    Person p = Person{}; // Case 2
    Person&& p = Person{}; // Case 3

    最佳答案

    中的三个语句并不完全相同.
    案例 2 需要 C++17 之前的移动构造
    该语言要求 X x = X{} 的代码存在移动构造函数-- 否则代码将无法编译。
    例如,使用 Person类定义如下:

    class Person{
    public:
    ...
    Person(Person&&) = delete;
    ...
    };
    将无法编译以下语句:
    Person p = Person{}; // Case 2
    compiler explorer 上的示例
    注:以上代码在 中完全有效并且由于措辞更改允许直接在其目标地址中构造对象,即使是不可移动和不可复制的(这就是人们通常所说的“保证复制省略”)。
    案例 3 是临时的终身延长
    第三种情况是临时构造,其生命周期通过绑定(bind)到右值引用来延长。在绑定(bind)到右值引用或 const 的某些情况下,可以延长临时对象的生命周期。左值引用。例如,以下两个构造是等效的,因为它们绑定(bind)到临时的生命周期:
    Person&& p3_1 = Person{};
    const Person& p3_2 = Person{};
    就作用域规则而言,它与任何其他自动变量具有相同的生命周期(例如,它将以与 Person person{} 相同的方式在作用域末尾调用析构函数)。但是,至少在 中可以用构造做什么, 与 Person p2 = Person{} 完全不同因为即使移动构造函数不存在,此代码也将始终编译(因为这是一个引用绑定(bind))。
    例如,让我们考虑一个不可移动、不可复制的类型,如 std::mutex .在 C++17 中,编写以下代码是有效的:
    std::mutex mutex = std::mutex{};
    但是在 C++11 中编译失败。但是,您可以自由编写:
    std::mutex&& mutex = std::mutex{};
    它创建一个临时变量并将其绑定(bind)到一个引用,该引用的生命周期将与在该点构造的任何作用域变量相同。
    compiler explorer 上的示例.
    注:故意传播临时对象的生命周期通常不是故意的,但早在 C++17 之前,这是使用不可移动对象实现几乎总是自动的语法的唯一方法。例如,上面可以重写: auto&& mutex = std::mutex{}

    关于c++ - 以下 3 种定义对象的方法是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64091190/

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