MSVC - 如何确定是否必须移动类型?

时间:2013-03-13 20:50:02

标签: c++ visual-c++ c++11 visual-studio-2012

我似乎遇到了编译器/库错误的问题。当我尝试

#include <iostream>
#include <type_traits>
#include <memory>

int main() 
{
    typedef std::unique_ptr<int> T;

    std::cout << "is_copy_assignable: " 
              << std::is_copy_assignable<T>::value 
              << "\n"
              << "is_copy_constructible: " 
              << std::is_copy_constructible<T>::value << "\n";
}

使用Visual Studio 2012 Update 1我得到

is_copy_assignable: 1
is_copy_constructible: 1

而不是

is_copy_assignable: 0
is_copy_constructible: 0

有替代解决方案吗?

2 个答案:

答案 0 :(得分:3)

这肯定是MS执行std::unique_ptr<>或类型特征的 bug 。这些类型特征应该按预期工作(参见实例here)。

答案 1 :(得分:3)

如果你仔细研究发生了什么,它会检查赋值运算符和ctor 是否存在,这就是全部。在MSVC的实现中,复制构造函数和赋值运算符在private的实现中是std::unique_ptr。但是它不进行任何访问检查。 MSVC尚未实现= delete等,这就是它返回true的原因。

玩了一段时间之后,我觉得我有一些可以用来检测私人拷贝的东西:

#include <type_traits>
#include <memory>

template <typename T>
struct wrap
{
   T t;
};

template<typename T, typename = int>
struct is_copyable : std::false_type { };

template<typename T>
struct is_copyable<T, 
    decltype(wrap<T>(std::declval<const wrap<T>&>()), 0)> : std::true_type
{};

class X
{
   public:
   X(const X&) {}
};

class Y
{
   Y(const Y&){}
};

int main()
{
    static_assert(is_copyable<std::unique_ptr<int>>::value, "Error!");
    static_assert(is_copyable<X>::value, "Error!");
    static_assert(is_copyable<Y>::value, "Error!");
}

Example on LWS

然而,这导致ICE与MSVC ...所以不起作用。