2

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

#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

有替代解决方案吗?

4

2 回答 2

3

这肯定是MS 实现任一类型特征或类型特征的错误std::unique_ptr<>这些类型特征应该可以按您的预期工作(请参阅此处的实时示例)。

于 2013-03-13T20:57:21.690 回答
3

如果您查看正在发生的事情,它会检查赋值运算符和 ctor 是否存在,仅此而已。在 MSVC 的实现中,复制构造函数和赋值运算符privatestd::unique_ptr' 的实现中。但是它不做任何访问检查。MSVC 尚未实施= delete等,这就是它返回的原因true

在玩了一段时间之后,我想我有一些东西可以用来检测私人复制 ctor:

#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!");
}

LWS 上的示例

但是,这导致了带有 MSVC 的ICE ......所以不起作用。

于 2013-03-13T21:00:01.930 回答