我似乎遇到了编译器/库错误的问题。当我尝试
#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
有替代解决方案吗?
答案 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!");
}
然而,这导致ICE与MSVC ...所以不起作用。