代码之家  ›  专栏  ›  技术社区  ›  Andreas Brinck

是否不需要此移动构造函数

  •  1
  • Andreas Brinck  · 技术社区  · 10 年前

    在以下代码中:

    class Base
    {
    public:
        Base(const SomeClass& c) : m_c(c) {}
        SomeClass m_c;
    };
    
    class Derived : Base
    {
    public:
        Derived(const SomeClass& c) : Base(c) {}
        Derived(SomeClass&& c) : Base(static_cast<Base&&>(c)) {} // Unnecessary?
    }
    

    上面的move构造函数是不必要的吗?我想不出一种情况,它会对左值参考值有什么好处?

    1 回复  |  直到 10 年前
        1
  •  3
  •   Yakk - Adam Nevraumont    10 年前

    好的,这个代码很奇怪。破碎了。

    static_cast<Base&&>(c) 创建临时 Base 对象然后,它将在省略被阻止的上下文中传递该临时基对象 基础 作为基础的对象 Derived .

    这会导致 SomeClass&& c 要首先复制, 然后移动 进入 基础 属于 派生的 如果 SomeClass 缺少move构造函数,这会导致 2. 在这种情况下,副本。

    我想不出你为什么要这么做。然而,在一些代码库中,我上面列出的副作用可能会产生明显的后果。

    将构造从 SomeClass类 Derived( SomeClass&& c ):Base(std::move(c)) {} 并添加 Base( SomeClass&& c ):m_c(std::move(c)) {} 基础 。那会移动 SomeClass类 顺利进入基地 m_c 而不是上面的体操。