【发布时间】:2015-12-29 20:23:35
【问题描述】:
给定两个非常简单的类:
class X
{
};
class Y : public X
{
};
为什么对于 Clang 和 GCC targeting C++14,std::is_assignable<X*, Y*>::value 是 false?当我以 C++11 为目标时,我的设置中是 true 和 Clang。
【问题讨论】:
标签: c++ c++14 typetraits
给定两个非常简单的类:
class X
{
};
class Y : public X
{
};
为什么对于 Clang 和 GCC targeting C++14,std::is_assignable<X*, Y*>::value 是 false?当我以 C++11 为目标时,我的设置中是 true 和 Clang。
【问题讨论】:
标签: c++ c++14 typetraits
这是因为在您的情况下,X* 变成了右值。您不能分配给右值。改为左值:
std::is_assignable<X*&, Y*>::value
// ~^~
【讨论】:
如果表达式
std::declval<T>() = std::declval<U>()在未求值的上下文中格式正确
但是您根本不能将 to 分配给一个右值(declval<X*>() 就是这样)。你需要一个 lvalue 在左手边的赋值:
std::is_assignable<X*&, Y*>::value
那是真的。如果 Clang 返回 true,那肯定是 Clang 错误。
【讨论】: