C++11:有没有办法强制类仅用作右值?

C++11:有没有办法强制类仅用作右值?,c++,c++11,C++,C++11,假设我设计了一个类,它应该始终只作为右值存在。总是 确保此类实例永远不会以左值形式出现在代码中的最佳方法是什么 如果没有这样的方法,最接近的方法是什么?这是不可能的。 如果你能描述你试图解决的问题,也许有人能提出替代方案。这是不可能的。 如果您能描述您试图解决的问题,可能会有人提出替代方案。您可以将类的所有相关函数都限定为rvalue: struct Foo { void frob(int a, int b) &&; }; 用法: Foo x; // x.frob(1,

假设我设计了一个类,它应该始终只作为右值存在。总是

确保此类实例永远不会以左值形式出现在代码中的最佳方法是什么

如果没有这样的方法,最接近的方法是什么?这是不可能的。 如果你能描述你试图解决的问题,也许有人能提出替代方案。

这是不可能的。
如果您能描述您试图解决的问题,可能会有人提出替代方案。

您可以将类的所有相关函数都限定为rvalue:

struct Foo
{
    void frob(int a, int b) &&;
};
用法:

Foo x;
// x.frob(1, 2);          // Error
std::move(x).frob(1, 2);  // Fine

Foo().frob(1, 2);         // Fine
上面提到的问题没有真正意义,因为您可以在任何上下文中创建任何价值类别,而与任何类型的类设计无关。例如:

template <typename T> T & stay(T && x) { return x; }

stay(Foo());   // lvalue

因此,与其担心用户如何获得值,不如约束用户如何使用值更为有效。

您可以对类的所有相关函数进行rvalue限定:

struct Foo
{
    void frob(int a, int b) &&;
};
struct Foo {
  template<typename... Args>
  static Foo make_rvalue(Args&&... args) { return {std::forward<Args>(args)...}; }
private:
  Foo() = default;
  Foo(Foo const&) = default;
  Foo(Foo &&) = default;
  Foo& operator=(Foo const&) = default;
  Foo& operator=(Foo &&) = default;
};
用法:

Foo x;
// x.frob(1, 2);          // Error
std::move(x).frob(1, 2);  // Fine

Foo().frob(1, 2);         // Fine
上面提到的问题没有真正意义,因为您可以在任何上下文中创建任何价值类别,而与任何类型的类设计无关。例如:

template <typename T> T & stay(T && x) { return x; }

stay(Foo());   // lvalue
因此,与其担心用户如何获得价值,不如约束用户如何使用价值可能更有效

struct Foo {
  template<typename... Args>
  static Foo make_rvalue(Args&&... args) { return {std::forward<Args>(args)...}; }
private:
  Foo() = default;
  Foo(Foo const&) = default;
  Foo(Foo &&) = default;
  Foo& operator=(Foo const&) = default;
  Foo& operator=(Foo &&) = default;
};
在这里,我们创建一个右值Foo,然后移动并用它构造另一个右值Foo,然后绑定它:

Foo&& f2 = Foo::make_rvalue( Foo::make_rvalue() );
任何其他构造函数将自动使用make_\rvalue。保密就行了

您还可以使右值成为自由函数。在foo中建立朋友关系:

我认为这是一种更漂亮的语法,make_\rvalue可以免费用于其他类型

缺点是所有构造函数都必须是隐式的,因为{}构造需要隐式构造。我想,您可以转而依赖RVO和复制/移动构造

在这里,我们创建一个右值Foo,然后移动并用它构造另一个右值Foo,然后绑定它:

Foo&& f2 = Foo::make_rvalue( Foo::make_rvalue() );
任何其他构造函数将自动使用make_\rvalue。保密就行了

您还可以使右值成为自由函数。在foo中建立朋友关系:

我认为这是一种更漂亮的语法,make_\rvalue可以免费用于其他类型


缺点是所有构造函数都必须是隐式的,因为{}构造需要隐式构造。我想,您可以转而依赖RVO和复制/移动构造。

x是一个左值。。。这不算数吗?@Mehrdad:我描述的是一种可能解决OP问题的方法,而不是回答她字面上的问题。。。实现这一点的最接近的方法。@Kerrek SB所以使用右值限定将是最接近的方法?但不能应用于析构函数,对吗?否则的话perfect@GabiMe:特殊成员函数是特殊的,将其视为普通成员函数通常没有意义。自然地,{const X;}应该可以工作,您不能对析构函数进行const限定,仅举另一个例子。你可能应该描述你真正的问题,而不是仓促地进入你认为的解决方案。最后一句话+1。x是左值。。。这不算数吗?@Mehrdad:我描述的是一种可能解决OP问题的方法,而不是回答她字面上的问题。。。实现这一点的最接近的方法。@Kerrek SB所以使用右值限定将是最接近的方法?但不能应用于析构函数,对吗?否则的话perfect@GabiMe:特殊成员函数是特殊的,将其视为普通成员函数通常没有意义。自然地,{const X;}应该可以工作,您不能对析构函数进行const限定,仅举另一个例子。你可能应该描述你真正的问题,而不是匆忙地去做你认为是解决问题的方法。最后一句话+1。