is_copy_assignable() возвращает false, когда задано назначение копирования

Почему 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 ответа

Решение

Поскольку ожидаемая подпись для оператора назначения копирования:

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

Это возвращает true,

Демо здесь.

Рассматривая требования для CopyAssignable (требуется is_copy_assignable), const T должен быть назначен

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's CopyAssignable стр.

Другие вопросы по тегам