当定义了复制赋值时,is_copy_assignable()返回false

时间:2014-06-26 17:09:06

标签: c++ g++4.8

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

2 个答案:

答案 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必须是可分配的。