我需要使用 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
问题出在哪里?
最佳答案
您的编译器可能没有正确地将赋值运算符定义为已删除。在关于隐式声明的特殊成员函数的 c++03 代码中,在未计算的操作数中进行此类赋值是可以的,即使该赋值如果出现在已计算的操作数中则格式不正确。原因是赋值运算符永远不会被隐式定义,而只会隐式声明,因此永远不会引发错误。
由于 c++11 中发生了变化,并且您的赋值运算符应该被自动删除,所以在我看来您的编译器有问题。
关于c++ - 为什么具有 const 成员的结构可以赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9425806/