0

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

2 回答 2

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>();格式正确。对于您的班级,它不是,因为您的复制赋值运算符只需要一个非常量T &,所以它不能被分配一个const T.

有关查看它的另一种方式,请参阅 cppreference 的CopyAssignable页面。

于 2014-06-26T17:18:14.197 回答
1

因为复制赋值运算符的预期签名是:

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

这返回true

演示在这里

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

于 2014-06-26T17:11:47.857 回答