以下是我编写的一些代码来说明我的问题:
struct Foo
{
Foo() {}
Foo( Foo && );
Foo( const Foo & ) = delete;
};
Foo GetFoo()
{
return Foo();
}
int main()
{
Foo f = GetFoo();
}
删除的复制构造函数会阻止隐式默认移动构造函数,因此我必须明确声明一个。但我既没有使用“= default”也没有为它提供实现,但整个事情正在编译和链接。如果我删除声明,它将不再编译。
我发现链接器并没有抱怨丢失的移动构造函数,这真的很令人惊讶。你能帮我理解为什么吗?
答案 0 :(得分:5)
在初始化type identifier = Function()
形式的变量时,编译器确认复制/移动构造函数被声明为可用,然后忽略它并尝试直接从右侧构造(“复制/移动省略”) )。然后它Function
将变量直接构造成main
,以跳过移动/复制(这是“返回值优化”)。这些工作一起工作并绕过任何和所有移动/副本,Function
最终直接构建f
。由于实际上没有使用移动构造函数,链接器没有查找它,因此没有注意到缺少的定义。