Подтвердить что ты не робот

Почему std:: is_assignable возвращает false со связанными типами указателей?

Учитывая два очень простых класса:

class X
{
};

class Y : public X
{
};

Почему, с Clang и GCC таргетинг на С++ 14, std::is_assignable<X*, Y*>::value есть false? Это true с Clang в моей настройке, когда я нацелен на С++ 11.

4b9b3361

Ответ 1

Это потому, что в вашем случае X* становится rvalue. Вы не можете назначить rvalue. Вместо этого замените на lvalue:

std::is_assignable<X*&, Y*>::value
//                  ~^~

Ответ 2

std::is_assignable проверяет:

Если выражение std::declval<T>() = std::declval<U>() хорошо сформировано в неоценимом контексте

Но вы не можете назначить rvalue (что и есть declval<X*>()). Вам нужно lvalue в левой части задания:

std::is_assignable<X*&, Y*>::value

Это было бы правдой. Если Clang возвращает true, это определенно ошибка Clang.