【问题标题】:MSVC - How can I find out if a type must be moved? [duplicate]MSVC - 如何确定是否必须移动类型? [复制]
【发布时间】:2013-03-14 06:01:43
【问题描述】:

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

#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

有其他解决方案吗?

【问题讨论】:

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


【解决方案1】:

这肯定是 MS 实现 std::unique_ptr&lt;&gt; 或类型特征的 错误。这些类型特征应该可以按您的预期工作(参见一个实时示例 here)。

【讨论】:

  • 我认为该代码也会因公共复制 ctor 而失败。
  • @JesseGood:你说得对,谢谢指出。
【解决方案2】:

如果您查看正在发生的事情,它会检查赋值运算符和 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!");
}

Example on LWS.

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

【讨论】:

    猜你喜欢
    • 2013-03-04
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2016-09-12
    • 2011-02-12
    • 2010-10-14
    相关资源
    最近更新 更多