小编Mas*_*uue的帖子

在结构化绑定定义中引入了中间变量?

[dcl.struct.bind] 9.6.4中,当初始化器是正确定义的类类型时,有结构化绑定的定义std\xe2\x80\x8b::\xe2\x80\x8btuple_\xc2\xadsize<E>\xe2\x80\x8b::\xe2\x80\x8bvalue

\n
\n

...变量以唯一名称ri引入,如下所示:
\n S Ui ri = 初始值设定项 ;
\n每个vi都是Ti类型的左值的名称,该左值引用绑定到ri的对象;\n引用的类型是Ti

\n
\n

我的问题是为什么需要引入ri,我们不能直接定义标识符vi作为对结果的引用吗get<i>(e)

\n

c++ language-lawyer c++17 structured-bindings

8
推荐指数
1
解决办法
256
查看次数

超出范围时转换为有符号类型行为

当源值无法在目标类型中表示时,根据cppreference将整数转换为有符号类型

  • 实现定义(C++20 之前)
  • 目标类型的唯一值等于源值模 2^n ,其中 n 是用于表示目标类型的位数 (C++20 起)

GCC实现定义的行为中还指定了

为了转换为宽度为 N 的类型,该值会以 2^N 为模减少到该类型的范围内;没有发出任何信号。

我猜也有人说同样的话。我的问题是减少/模数结果是否仍然可能超出目标签名类型的范围?比如说signed char c = 255,255 模 2^8 仍然是 255,没有变化。这个模数结果如何适合目标类型?

这个答案展示了一种方法,首先将值反转并加 1,然后在前面添加一个有符号位。我不确定这是否是实际所做的。

解释强调部分的正确/标准方法是什么?

c++ implicit-conversion c++20 implementation-defined-behavior

1
推荐指数
1
解决办法
339
查看次数