引用限定符和已删除的成员方法

Reference qualifiers and deleted member methods

本文关键字:删除 成员方法 引用      更新时间:2023-10-16

请考虑以下代码:

#include<utility>
struct S {
    void f(int) = delete;
    void f(int) && { }
};
int main() { }

它没有编译说成员方法不能重载,当然这是有道理的。

另一方面,编译以下代码:

#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);
}

这是法典吗?
难道不可能在同一类中定义两个完全不同的接口,前者与左值一起使用,后者与右值一起使用?
除了它没有多大意义之外,但它确实伤害了我。
删除的函数不应该作为一个整体删除,而不是仅在您是左值时才删除吗?
此功能的目的是什么?是经典的晦涩角落案例还是还有更多我看不到的东西?

有时,如果对象是 l 值r 值,则禁止某些操作是有意义的。

想象一下 RAII 包装器用于FILE*.它在构造函数中打开文件,在析构函数中关闭它,将需要手动控制的 C 功能转换为C++异常安全类。为了与 C 接互,有一个返回原始指针的 .get() 成员。有人可能会写道:

FILE* file = CFile("file.txt").get();

它会编译,但它是错误的:文件将尽快关闭,因为file变量将被初始化。如果您删除 r 值重载(首先从不提供它),那么它将导致编译时错误并使我们免于寻找错误。