Ответ 1
Это потому, что в вашем случае X*
становится rvalue. Вы не можете назначить rvalue. Вместо этого замените на lvalue:
std::is_assignable<X*&, Y*>::value
// ~^~
Учитывая два очень простых класса:
class X
{
};
class Y : public X
{
};
Почему, с Clang и GCC таргетинг на С++ 14, std::is_assignable<X*, Y*>::value
есть false
? Это true
с Clang в моей настройке, когда я нацелен на С++ 11.
Это потому, что в вашем случае X*
становится rvalue. Вы не можете назначить rvalue. Вместо этого замените на lvalue:
std::is_assignable<X*&, Y*>::value
// ~^~
std::is_assignable
проверяет:
Если выражение
std::declval<T>() = std::declval<U>()
хорошо сформировано в неоценимом контексте
Но вы не можете назначить rvalue (что и есть declval<X*>()
). Вам нужно lvalue в левой части задания:
std::is_assignable<X*&, Y*>::value
Это было бы правдой. Если Clang возвращает true, это определенно ошибка Clang.