引用限定符和已删除的成员方法
Reference qualifiers and deleted member methods
请考虑以下代码:
#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 值重载(首先从不提供它),那么它将导致编译时错误并使我们免于寻找错误。
相关文章:
- 从私有成员变量的成员方法返回unique_ptr
- 如何将类成员方法的参数列表自动填充写入可变参数?
- C++类析构函数删除成员(如果"owner"?
- 如何对绑定的成员方法进行typedef,然后将该类型用作模板参数
- 从类C++外部调用指向成员方法的成员指针
- 在Visual Studio中删除成员std::vector::d ata()
- 在另一个 QThread 上运行成员方法时,无法将事件发送到其他线程拥有的对象
- 对成员类型的成员方法使用 std::result_of<>
- 我是否应该在构造函数或成员方法中进行大量初始化工作
- 删除节点方法实际上不会删除二叉搜索树中的节点.C++
- 如何检查是否调用了成员方法
- 我怎么可能从尚未定义某些成员方法的类创建实例?(C++)
- 有没有办法强制对 clang-format/clang-tidy 中的类成员/方法使用 "this->"?
- 指向 objc 类成员方法的函数指针,用于C++
- 为什么删除成员变量的复制构造函数不会阻止默认的复制构造函数
- 对集合调用成员方法
- JetBrains CLion 不能建议字符串的成员方法
- 队列类中的非空删除成员函数
- 我无法在班级中获得MED股票来调用成员方法
- 引用限定符和已删除的成员方法