【问题标题】:Move constructor without implementation, yet it works在没有实现的情况下移动构造函数,但它可以工作
【发布时间】:2014-05-01 20:01:40
【问题描述】:

这是我写的一些代码来说明我的问题:

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

Foo GetFoo()
{
    return Foo();
}

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

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

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

【问题讨论】:

标签: c++ constructor move-semantics


【解决方案1】:

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

【讨论】:

  • 是的,我现在重写了答案。我今天是一个严肃的失败者。
猜你喜欢
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
  • 2017-04-11
  • 1970-01-01
相关资源
最近更新 更多