为什么is_copy_assignable()
在这里返回false(g ++ 4.8.2):
#include <iostream>
#include <utility>
#include <type_traits>
using namespace std;
class thing {
public:
int n;
thing () : n(1) { }
thing (thing& x) : n(x.n) { }
thing& operator= (thing& x) {
n = x.n;
return *this;
}
};
using namespace std;
int main (void) {
cout << is_copy_assignable<thing>::value << endl;
return 0;
}
答案 0 :(得分:2)
std::is_copy_assignable<T>
在§20.9.4.3[meta.unary.prop]中正式定义为std::is_assignable<T &, const T &>
。
现在这个(std::is_assignable<T, U>
)反过来要求declval<T>() = declval<U>();
格式正确。对于您的类,它不是,因为您的复制赋值运算符只接受非const T &
,因此无法为其分配const T
。
另一种查看方式,请参阅cppreference的CopyAssignable
页面。
答案 1 :(得分:1)
因为复制赋值运算符的预期签名是:
thing& operator= (const thing& x) // note the const parameter
返回true
。
演示here。
查看CopyAssignable的要求(is_copy_assignable
要求),const T
必须是可分配的。