Is_copy_assignable()在定义拷贝赋值时返回false

is_copy_assignable() returns false when copy assignment defined

本文关键字:赋值 拷贝 返回 false 定义 copy assignable Is      更新时间:2023-10-16

为什么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;
}                     

std::is_copy_assignable<T>在§20.9.4.3 [meta.unary]中有正式定义。道具]作为std::is_assignable<T &, const T &>

现在这(std::is_assignable<T, U>)反过来要求declval<T>() = declval<U>();是良构的。对于你的类,它不是,因为你的复制赋值操作符只接受一个非const的T &,所以它不能被赋值一个const T

另一种查看方式,参见cppreference的CopyAssignable页面。

因为复制赋值操作符的期望签名是:

 thing& operator= (const thing& x)  // note the const parameter

返回true

演示。

查看CopyAssignable的要求(is_copy_assignable要求),const T必须是可分配的