【发布时间】:2014-03-19 08:09:25
【问题描述】:
尝试编译以下代码:
struct Foo
{
explicit Foo ( void ) { }
explicit Foo ( Foo&& rhs ) { }
};
Foo bar ( void )
{
return Foo();
}
得到以下错误:
调用 'Foo' 的隐式删除的复制构造函数
嗯,很明显,copy-ctor 被隐式删除了。
问题1:为什么编译器需要Foo的copy-ctor?我希望 bar 的返回值是从右值 Foo() 和 move-ctor 构造的。
然后我将 move-ctor 重新声明为隐式,一切编译成功。
问题 2:为什么当我将 move-ctor 重新声明为隐式时,编译器不再需要 copy-ctor?
问题 3:explicit 关键字在复制和移动 ctor 的上下文中是什么意思,因为它绝对意味着与常规 ctor 的上下文不同的东西。
【问题讨论】:
-
@MarkGarcia 谢谢,但即使在修复之后,所有问题仍然是真实的。
-
有趣。我从不认为
explicit会应用于左值/右值引用。 -
@MarkGarcia 仍然需要在
Foo&&和Foo之间进行隐式转换。 -
请注意,代码在(未标记的)C++17 中非常好。此外,
bar定义会很好,即使复制和移动 ctor 都被删除/无法访问/等。 C++17 强制要求 RVO 并为其应用程序使用不同的规则。
标签: c++ c++11 constructor move-constructor c++14