4

考虑以下代码:

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

那是合法的代码吗?
难道不能在同一个类中定义两个完全不同的接口,前者用于左值,后者用于右值?
除了它没有多大意义之外,它真的伤害了我。
不应该将已删除的函数作为一个整体删除,而不是仅当您是左值时才删除
此功能的目的是什么?它是经典的不起眼的角落案例还是我看不到的东西?

4

1 回答 1

7

如果 object 是l-r-value,有时禁止某些操作是有意义的。

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

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

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

于 2016-02-13T22:52:56.167 回答