移动构造函数没有实现,但它的工作原理

时间:2014-05-01 20:01:40

标签: c++ constructor move-semantics

以下是我编写的一些代码来说明我的问题:

struct Foo
{
    Foo() {}
    Foo( Foo && );
    Foo( const Foo & ) = delete;
};

Foo GetFoo()
{
    return Foo();
}

int main()
{
    Foo f = GetFoo();
}

删除的复制构造函数会阻止隐式默认移动构造函数,因此我必须明确声明一个。但我既没有使用“= default”也没有为它提供实现,但整个事情正在编译和链接。如果我删除声明,它将不再编译。

我发现链接器并没有抱怨丢失的移动构造函数,这真的很令人惊讶。你能帮我理解为什么吗?

1 个答案:

答案 0 :(得分:5)

在初始化type identifier = Function()形式的变量时,编译器确认复制/移动构造函数被声明为可用,然后忽略它并尝试直接从右侧构造(“复制/移动省略”) )。然后它Function将变量直接构造成main,以跳过移动/复制(这是“返回值优化”)。这些工作一起工作并绕过任何和所有移动/副本,Function最终直接构建f。由于实际上没有使用移动构造函数,链接器没有查找它,因此没有注意到缺少的定义。