C++ 在没有实现的情况下移动构造函数,它仍然可以工作

C++ 在没有实现的情况下移动构造函数,它仍然可以工作,c++,constructor,move-semantics,C++,Constructor,Move Semantics,下面是我为说明我的问题而编写的一些代码: structfoo { Foo(){} Foo(Foo&&); Foo(const Foo&)=删除; }; Foo GetFoo() { 返回Foo(); } int main() { Foo f=GetFoo(); } 删除的复制构造函数阻止隐式默认移动构造函数,因此我必须明确声明一个。但我既没有使用“=default”,也没有为它提供实现,但整个过程都能正确编译和链接。如果我删除该声明,它将不再编译 我发现链接器没有抱怨缺少移动构造函数,这真是令

下面是我为说明我的问题而编写的一些代码:

structfoo
{
Foo(){}
Foo(Foo&&);
Foo(const Foo&)=删除;
};
Foo GetFoo()
{
返回Foo();
}
int main()
{
Foo f=GetFoo();
}
删除的复制构造函数阻止隐式默认移动构造函数,因此我必须明确声明一个。但我既没有使用“=default”,也没有为它提供实现,但整个过程都能正确编译和链接。如果我删除该声明,它将不再编译


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

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

它可能被省略了。我只是试了一下,但似乎仍然有效。奇怪的我在coliru的g++4.8.2中也遇到了同样的问题:可能godbolt没有链接?示例:哦,糟糕,我找了一个带有选项的在线gcc编译器,认为这个编译器也在链接,对此表示抱歉。是的,我现在重写了答案。我今天真是个失败者。