尝试编译以下代码:
struct Foo
{
explicit Foo ( void ) { }
explicit Foo ( Foo&& rhs ) { }
};
Foo bar ( void )
{
return Foo();
}
遇到以下错误:
call to implicitly-deleted copy constructor of 'Foo'
很明显,复制构造函数被隐式删除了。
问题1:为什么编译器需要 Foo
的复制构造函数?我希望 bar
的返回值可以用移动构造函数从右值 Foo()
构造出来。
然后我将移动构造函数重新声明为隐式的,一切都成功编译了。
问题2:为什么当我将移动构造函数重新声明为隐式时,编译器不再需要复制构造函数?
问题3:在复制和移动构造函数的上下文中,“explicit”关键字意味着什么,因为它明显与常规构造函数的上下文不同?
Foo&&
和Foo
之间进行隐式转换。 - juanchopanzabar
的定义也是可以的。 C++17使RVO成为强制性,并使用不同的规则进行应用。 - Daniel Langr