如何确保一个物体真的会从?
问题描述:
考虑下面的代码,它试图移动构造一个shared_ptr
,但是由于一个错误出现复制构造它:如何确保一个物体真的会从?
#include <utility>
#include <cassert>
#include <memory>
int main()
{
const auto x=std::make_shared<int>(4325); // can't be moved from
const std::shared_ptr<int> y(std::move(x)); // silently copy-constructs
assert(x==nullptr); // fails
}
这里的事实是,由于x
是const
,y
被拷贝构造只有在运行时才能检测到移动构建。有什么办法可以确保移动真的发生,在编译时?
答
你可以写一个检查,看是否表达可以从移动:
template <typename T>
constexpr bool can_be_moved (T&&) {
return !std::is_reference<T>{} && !std::is_const<T>{};
}
然后你就可以static_assert
是std::move(x)
可以从移动:
int main()
{
const auto x=std::make_shared<int>(4325);
const std::shared_ptr<int> y(std::move(x));
static_assert(can_be_moved(std::move(x)), "x must be able to be moved from");
}
我真的不知道这在实践中有多有用。除非你知道这个班的构造者是做什么的,否则你仍然不能保证有什么东西会被真正移开。
为什么你绝对需要'x'来移动?副本将增加引用计数器,并且销毁将使其减少。这将需要一些*真正*热代码,这有所作为。 – TartanLlama
@TartanLlama对象可能不一定是'shared_ptr',它可能是一些重度用户定义的类。 – Ruslan
请参阅:http://*.com/a/28595207/4181011 –