gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:16:12 25 4
gpt4 key购买 nike

考虑以下代码:

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产生一个拼写为 int& const 的野兽而不是const int& (或同样好 int const & )。

所以是的,由于引用不能反弹到不同的对象,它实际上是没有任何关键字的常量。因此const和符号之后过多。看起来它已被悄悄删除,我无法引用所需编译器行为的标准,请参阅@Quentin 的评论。

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

关于c++ - std::is_same 在类型相等性检查上的荒谬行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58679898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com