我需要使用std::is_assignable
类型的特征,这些特征在我想要支持的最旧的编译器版本中不可用。因为我必须自己实现这个(好吧,我承认,有一些互联网偷看),我现在想知道这是我的实现中的错误还是std::is_assignable
的一般问题。
首先,这是我的测试结构:
struct Bar {
bool const cb; // this should kill the default assignment operator
int i;
};
这是我的stdreplace::is_assignable
template <typename T> struct is_assignable : private std::__sfinae_types {
private:
template <typename T1>
static decltype(std::declval<T1>() = std::declval<T1>(),__one()) test(int);
template <typename T1>
static __two test(...);
public:
static bool const value = sizeof(test<T>(0)) == sizeof(__one);
};
然而,它告诉我,Bar
是可分配的:
int: 1
Bar: 1
int[2]: 0
问题出在哪里?
答案 0 :(得分:3)
您的编译器可能没有正确地将赋值运算符定义为已删除。在关于隐式声明的特殊成员函数的c ++ 03代码中,未评估的操作数内的这种赋值很好,即使它在一个计算的操作数中出现时也会被赋值。原因是因为asignment运算符永远不会被隐式定义,而只是隐式声明,因此永远不会出现错误。
由于c ++ 11中的更改已经自动删除了赋值运算符,因此我认为您的编译器有错误。