std::is_same在类型相等检查上的荒谬行为

std::is_same absurd behaviour on type equality check

本文关键字:检查 荒谬 is same 类型 std      更新时间:2023-10-16

考虑以下代码:

struct A
{
using type = int;
using reference = int&;
};
static_assert(std::is_same_v<A::type&, A::reference>); // <-- Success, as it would be
static_assert(std::is_same_v<const A::type&, const A::reference>); // <-- Fail!!

发生了什么事??为什么它们不再是同一类型了?我花了很多时间找到这个,它看起来真的是一个编译器错误

首先,const int&可以说是对常量int的引用,而不是对int的常量引用。因此,将const关键字添加到A::reference中会产生一个beast,拼写为int& const而不是const int&(或同样精细的int const &(。

所以,是的,因为引用不能反弹到不同的对象,所以在没有任何关键字的情况下,它实际上是常量。因此CCD_ 7在一个安培数之后是过量的。看起来它被悄悄删除了,我无法引用所需编译器行为的标准,请参阅@Quentin的评论。

其次,答案可能取决于你真正想要实现的目标。如果A是一个容器,那么它应该有一个A::const_reference成员类型,您应该使用它。如果它是一个更通用的范围而不是容器,那么它的referenceconst_reference成员类型可能是两个完全不相关的代理对象类。如果控制A,请添加一个const_reference成员类型。否则,@Evg提供了一个解决方案。也许更简单的解决方案就是const std::decay_t<A::reference>&