为什么C++ 11使" deleted"函数参与重载决策?
为什么这有用?或者换句话说,为什么它们被隐藏而不是被完全删除?
当按值返回本地对象时,C++编译器可以通过利用移动语义来优化不必要的副本(复制省略).
" 可以优化"意味着如果不满足适当的条件,则行为应该基于副本回退到默认的值语义返回.
因此,据我所知,按值返回可复制对象始终有效.
但编译器(clang和gcc)似乎不同意我的解释,如下面的MWE所示.
class Foo {
public:
Foo();
Foo(const Foo&);
Foo(Foo&&) = delete;
}
Foo f() { return Foo(); } // error: call to explicitly deleted constructor of 'Foo'
Foo g() { Foo a; return a; } // gcc complains, clang is fine
Foo x = g(); // error: call to explicitly deleted constructor of 'A'
Run Code Online (Sandbox Code Playgroud)
Q1:按值返回是否要求对象可移动?
Q2:如果没有,gcc和clang在我的MWE上行为不端,还是我错过了其他的东西?