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