Почему std:: is_assignable возвращает false со связанными типами указателей? Учитывая два очень простых класса: class X { }; class Y : public X { }; Почему, с Clang и GCC таргетинг на С++ 14, std::is_assignable<X*, Y*>::value есть false? Это true с Clang в моей настройке, когда я нацелен на С++ 11. Ответ 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.
Ответ 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.