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

时间:2016-02-13 22:41:49

标签: c++ c++11 deleted-functions ref-qualifier

请考虑以下代码:

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

那是合法代码吗? 是不是可以在同一个类中定义两个完全不同的接口,前者用于左值,后者用于右值? 除了它没有多大意义,但它确实伤害了我 不应该删除已删除的功能作为一个整体,而不是仅当你是左值时才删除吗? 这个功能的目的是什么?它是经典的模糊角落案例还是还有一些我无法看到的东西?

1 个答案:

答案 0 :(得分:6)

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

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

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

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