std::is_same在类型相等检查上的荒谬行为
std::is_same absurd behaviour on type equality check
考虑以下代码:
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
成员类型,您应该使用它。如果它是一个更通用的范围而不是容器,那么它的reference
和const_reference
成员类型可能是两个完全不相关的代理对象类。如果控制A
,请添加一个const_reference
成员类型。否则,@Evg提供了一个解决方案。也许更简单的解决方案就是const std::decay_t<A::reference>&
。
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- C++模板来检查友元函数的存在
- 检查输入是否不是整数或数字
- 试图让变量检查数组中的某些内容
- 检查值是否在集合p1和p2中,但不在p3中
- C++概念:如何使用'concept'检查模板化结构的属性?
- 概念TS检查忽略私有访问修饰符
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 如何在C++中检查2D数组中负值的输入验证
- C++:正在检查LinkedList中的回文-递归方法-错误
- 使用for循环检查数组中的重复项
- 如何检查一个c++字符串中有多少相同的字符/数字
- 检查不带转换的扫描格式
- 如何检查线程是否锁定
- 清除前检查矢量
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- C++LDAP检查用户是否是特定组的成员
- 检查TCHAR数组输入是否为带符号整数C++
- std::is_same在类型相等检查上的荒谬行为