防止C++中的L值实例化14

PSk*_*cik 8 c++ c++14

C++ 14中的方法可以判断它们是在L值还是R值上调用:

struct A{
  A() { puts("Ctor"); }
  void m() const & { puts("L-value"); }
  void m() const && { puts("R-value"); }
};

int main(){
  A a; //Ctor
  a.m() //L-value
  A().m(); //Ctor; R-value
}
Run Code Online (Sandbox Code Playgroud)

ctor可以告诉它正在构建哪种类型?我可以完全禁用我班级的L值构造吗?

我有一个代理类(实际上是几个),它应该总是转换为其他东西.使用它而不转换是一个错误.我可以在运行时,如检测到错误,加入了bool used_ = 0;会员#ifndef NDEBUG;,并在我的用户指定的强制设置它,然后做assert(used_)代理类的Dtor,但是它会好得多,如果我能得到编译器来防止instatiation L-value的情况下,那个代理首先是:

 auto x = Proxy().method1().method2(); // no
 Proxy p; // no
 Target x = Proxy(); //yes
 Target x = Proxy().method1().method2(); //yes
Run Code Online (Sandbox Code Playgroud)

我可以用C++ 14做类似的事吗?

Ice*_*ire 2

当然是为什么:

#include <iostream>
using namespace std;

class B;

class A
{
public:
    A(B&& b) {}

    A(const B&) = delete;
};

class B {};

int main()
{
    B b;

    // A a1; <- error
    // A a2 = b; // <- error
    A a3 = move(b); // <- fine

    return 0;
}
Run Code Online (Sandbox Code Playgroud)