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做类似的事吗?
当然是为什么:
#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)