如何确保一个物体真的会从?

问题描述:

考虑下面的代码,它试图移动构造一个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 
} 

这里的事实是,由于xconsty被拷贝构造只有在运行时才能检测到移动构建。有什么办法可以确保移动真的发生,在编译时

+0

为什么你绝对需要'x'来移动?副本将增加引用计数器,并且销毁将使其减少。这将需要一些*真正*热代码,这有所作为。 – TartanLlama

+1

@TartanLlama对象可能不一定是'shared_ptr',它可能是一些重度用户定义的类。 – Ruslan

+0

请参阅:http://*.com/a/28595207/4181011 –

你可以写一个检查,看是否表达可以从移动:

template <typename T> 
constexpr bool can_be_moved (T&&) { 
    return !std::is_reference<T>{} && !std::is_const<T>{};  
} 

然后你就可以static_assertstd::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"); 
} 

我真的不知道这在实践中有多有用。除非你知道这个班的构造者是做什么的,否则你仍然不能保证有什么东西会被真正移开。