【发布时间】:2014-06-01 13:18:23
【问题描述】:
五年前我也有同样的问题: Disallowing creation of the temporary objects
我再次询问的原因是我对 C++11 和 C++14 防止构造临时对象的技术特别感兴趣。
一个想法是使用“*this 的右值引用”:
class ScopedLock
{
public:
void enable() && = delete;
void enable() &
{
is_enabled = true;
}
~ScopedLock()
{
if (!is_enabled) {
std::cerr << "ScopedLock misuse." << std::endl;
std::terminate();
}
}
private:
bool is_enabled = false;
};
int main()
{
// OK
ScopedLock lock;
lock.enable();
// Compilation error.
ScopedLock().enable();
// std::terminate
ScopedLock();
// std::terminate
ScopedLock lock;
std::cout << "Y" << std::endl;
}
也许有更好的方法?
【问题讨论】:
-
如果你写
void enable() && = delete;这实际上会阻止像ScopedLock().enable();这样的东西编译。但是,它不会阻止ScopedLock()编译。 -
好点。绝对是一个进步。
-
如果可以在析构函数中添加一个右值引用限定符,问题就解决了。但据我所知,这是不可能的。
-
template<typename T>typename std::decay<T>::type& as_lvalue(T&&t){return t;}然后as_lvalue( ScopedLock{} ).enable();-- 所以上面的方法不起作用。 -
作为一个 XY 问题,您可以将锁与锁定的数据结合起来。仅通过锁类的实例提供对数据的访问。