引用限定符和删除的成员方法
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);
}
那是合法的代码吗?
难道不能在同一个class中定义两个完全不同的接口,前者与左值一起使用,后者与右值一起使用吗?
除了没有多大意义,但是真的很心疼我
一个被删除的函数不应该被整体删除,而不是deleted only if you are a lvalue?
此功能的目的是什么?是 classic 晦涩难懂的角落案例还是还有其他我看不到的东西?
如果对象是 l- 或 r-value.
,有时禁止某些操作是有意义的
想象一下 FILE*
的 RAII 包装器。它在构造函数中打开文件,在析构函数中关闭文件,将需要手动控制的 C 功能转变为 C++ 异常安全 class。要与 C 接口交互,有一个 .get()
成员,其中 returns 原始指针。有人可能会写:
FILE* file = CFile("file.txt").get();
它会编译,但它是错误的:文件会尽快关闭,因为 file
变量会被初始化。如果您删除 r 值重载(首先从不提供它),那么它将导致编译时错误并使我们免于寻找错误。
考虑以下代码:
#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);
}
那是合法的代码吗?
难道不能在同一个class中定义两个完全不同的接口,前者与左值一起使用,后者与右值一起使用吗?
除了没有多大意义,但是真的很心疼我
一个被删除的函数不应该被整体删除,而不是deleted only if you are a lvalue?
此功能的目的是什么?是 classic 晦涩难懂的角落案例还是还有其他我看不到的东西?
如果对象是 l- 或 r-value.
,有时禁止某些操作是有意义的想象一下 FILE*
的 RAII 包装器。它在构造函数中打开文件,在析构函数中关闭文件,将需要手动控制的 C 功能转变为 C++ 异常安全 class。要与 C 接口交互,有一个 .get()
成员,其中 returns 原始指针。有人可能会写:
FILE* file = CFile("file.txt").get();
它会编译,但它是错误的:文件会尽快关闭,因为 file
变量会被初始化。如果您删除 r 值重载(首先从不提供它),那么它将导致编译时错误并使我们免于寻找错误。