sky*_*ack 4 c++ deleted-functions c++11 ref-qualifier
请考虑以下代码:
#include<utility>
struct S {
void f(int) = delete;
void f(int) && { }
};
int main() { }
Run Code Online (Sandbox Code Playgroud)
它没有编译说成员方法不能重载,当然它是有道理的.
另一方面,以下代码编译:
#include<utility>
struct S {
void f(int) & = delete;
void f(int) && { }
};
int main() {
S s;
// s.f(42); <-- error, deleted member method
std::move(s).f(42);
}
Run Code Online (Sandbox Code Playgroud)
这是合法代码吗?
是不是可以在同一个类中定义两个完全不同的接口,前者用于左值,后者用于右值?
除了它没有多大意义,但它确实伤害了我.
删除的功能不应该作为一个整体删除,而不是仅在你是左值时删除吗?
这个功能的目的是什么?它是经典的模糊角落还是还有一些我看不到的东西?
有时,它是有道理的,禁止某些操作,如果对象是1-或R值.
想象一下RAII包装器FILE*.它在构造函数中打开文件,在析构函数中关闭它,将需要手动控制的C特性转换为C++异常安全类.要与C接口交互,有一个.get()返回原始指针的成员.有人可能写道:
FILE* file = CFile("file.txt").get();
它会编译,但它是错误的:文件将很快关闭,因为file变量将被初始化.如果你删除一个r值重载(从不首先提供它),那么它将导致编译时错误并使我们免于寻找bug.