C++ 显式默认/删除的函数能否在ref限定符上重载? 简介
:一种消除隐含对象的rl值的方法。作为一个简单的例子,以下面的课程为例C++ 显式默认/删除的函数能否在ref限定符上重载? 简介,c++,c++11,C++,C++11,:一种消除隐含对象的rl值的方法。作为一个简单的例子,以下面的课程为例 class example { int member; public: // ... int& value() &; // ^ int&& value() &&; // ^^ int const& value() const&; //
class example
{
int member;
public:
// ...
int& value() &;
// ^
int&& value() &&;
// ^^
int const& value() const&;
// ^
};
使用此C++11功能(语法标记为^
),允许我们控制将使用调用的value()
的版本
- l值
- 临时工
- 常数l值
*本
:将特殊成员函数指定为已生成编译器(默认值)定义或无法访问(删除)。例如
struct type {
type(const type&) = delete;
type& operator=(const type&) = delete;
};
上述结构实现了不可复制,语义非常清晰
问题
- 是否可以/有效地组合这些功能李>
- 哪些情况是明确禁止的或不良风格
- 这种组合是否有任何用例/模式?(例如,基于rl值快速轻松地创建条件接口)
是的,但是没有太多用处,因为构造函数和析构函数不能通过ref限定
您可以引用赋值运算符:
struct S {
S &operator=(const S &) && = default;
};
int main() {
S s;
S() = s; // OK
s = S(); // error - LHS must be an rvalue
}
然而,我有点无法想象这会有什么用处。因为你几乎可以删除任何东西,这对于清除错误消息(而不是“未找到重载”)非常有用。有些相关: