为什么 std::is_assignable return false 与相关的指针类型有关?

Why does std::is_assignable return false with related pointer types?

给出两个很简单的类:

class X
{
};

class Y : public X
{
};

为什么使用 Clang 和 GCC targeting C++14std::is_assignable<X*, Y*>::valuefalse?当我以 C++11 为目标时,true 在我的设置中使用了 Clang。

这是因为在您的情况下 X* 变成了右值。您不能分配给右值。改为左值:

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

std::is_assignable 检查:

If the expression std::declval<T>() = std::declval<U>() is well-formed in unevaluated context

但是您根本无法将 分配给 右值(这就是 declval<X*>() 的值)。您需要在赋值的左侧有一个 lvalue

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

确实如此。如果 Clang 返回 true,那绝对是 Clang 错误。