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