c++ - 这个移动构造函数是不必要的吗

标签 c++ c++11

在下面的代码中:

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?
}

上面的移动构造函数是不是不必要的?我想不出它会比左值引用有任何优势的场景?

最佳答案

好吧,那个代码很奇怪。坏了。

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

这会导致传递 SomeClass&& c首先被复制,然后移动BaseDerived .如果SomeClass缺少移动构造函数,在这种情况下会导致 2 个拷贝。

我想不出您想这样做的理由。但是,在某些代码库中,我上面列出的副作用可能会产生明显的后果。

SomeClass 移动构造的更传统方法是Derived( SomeClass&& c ):Base(std::move(c)) {}并添加 Base( SomeClass&& c ):m_c(std::move(c)) {}Base .那移动SomeClass顺利进入基地的m_c而不是上面的体操。

关于c++ - 这个移动构造函数是不必要的吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29017544/

相关文章:

c++ - 带花括号初始化器列表的已删除构造函数的默认构造

c++ - 执行策略与何时使用它们之间的区别

c++ - 如何制作 std::list 数组?

c++ - 最终的虚函数有什么意义?

c++ - 为什么在已删除的默认构造函数旁边定义一个空拷贝构造函数会使空列表的值初始化失败?

C++ 如何在没有 std::function 的情况下声明函数返回函数?

c++ - x!=x 是实现 std::isnan() 的合法方式吗

c++ - 项目之间应该如何依赖?

c++ - Qt-GUI有几个 "pages",如何同步几个QWidgets的大小

c++ - 确定可变参数 C++11 模板化 lambda 函数的返回类型