当前位置: 首页 > 知识库问答 >
问题:

为什么std::vector不能接受size_t类型的iota_view向量?

姬乐池
2023-03-14

nsize_t但对 int无符号时,以下代码无法编译。

#include <vector>
#include <ranges>

int main() {
    size_t n = 1;
    auto view = std::ranges::iota_view{n, n};
    std::vector test(view.begin(), view.end()); //std::vector dislikes these itterators
}

https://godbolt.org/z/a3eGeMWqh

共有2个答案

廖琪
2023-03-14
匿名用户

我想这个扣减是否可以,确实是不明确的。

要在此处使用的演绎指南要求迭代器是(旧版)输入迭代器。它(大部分)未指定实现将在多大程度上验证这一点。它可能会也可能不会检查标准中列出的要求。有关详细信息,请参阅 [html" target="_blank">容器要求.一般]/18。

然而,其中一个要求是< code>difference_type是一个“有符号整数类型”(或< code>void),参见[iterator.iterators]/2.2。

另一方面,iota_view的迭代器仅指定具有difference_typedifference类型,如果存在宽度大于值类型宽度的类型,则该类型为有符号整数类型。size_t通常不是这样。在这种情况下,标准只要求difference_type是“有符号的类整数类型”。详见[range.iota.view]/1和[sequence.reqmts]/13.3。

类似有符号整数的类型也可能是行为类似于非整数类型的类型。但是,如果选择的类型实际上不是整数类型,则迭代器不满足旧版迭代器要求,因此无法满足演绎指南的要求。

您可以检查std::begin(view)::difference_type以查看GCC选择了__int128,它的行为类似于整数,但实现不考虑扩展整数类型(std::is_integral_v

GCC仍然为迭代器提供std::input_iterator_tag作为iterator_category成员,但是根据LWG 3670的决议,在这种情况下应该被删除,并且该决议似乎也向我表明,std::iota_view的迭代器在这种情况下真的不应该保证是遗留迭代器。我对此知之甚少,无法确定这里是否存在缺陷。如果这是有意为之,我似乎很不幸。

这同样适用于构造函数本身,因此在std::向量上指定模板参数也不会解决这个问题。参见[sequence.reqmts]/13.1。

慕嘉运
2023-03-14

为了解决整数溢出的问题,差型iota_view

具有整数类差异类型的迭代器不是C 17输入迭代器,因此这使得向量模板推导失败,因为迭代器对参数不满足__LegacyInputIterator的要求(即差异类型应该只是一个(有符号的)整数类型)。

值得注意的是,__int128在GNU扩展下被视为整型(它为std::integral建模),您的代码将在

 类似资料:
  • https://godbolt.org/z/P97MaK 我玩的概念和预期d::is_equality_comparable工作矢量,但它没有。 编译错误在 内部失败,而不是在受概念保护的函数边界处失败。 这是错误还是预期行为?

  • 我遇到了一个有趣的问题,我不明白发生了什么: 据我所知,我提供的单个整数参数可以解释为使用参数调用构造函数,也可以解释为使用初始化列表的构造函数。似乎只有当我提供左值时才调用initialiser_list构造函数,但当我提供r-value(至少是文字)时,构造函数。为什么会这样? 这也意味着: 结果仅为大小为1的向量; 结果是一个大小为num\u元素的向量,但我认为应该避免这种初始化,因为偶尔会

  • 下面的代码显示了我要做的:

  • 我有一个整数向量: 考虑到将始终为偶数。 我只是想把相邻的元素转换成一对,像这样: 即,两个相邻元件接合成一对。 我可以使用什么STL算法轻松实现这一点?有没有可能通过一些标准算法来实现这一点? 当然,我可以很容易地编写一个旧的索引for循环来实现这一点。但我想知道最简单的解决方案是什么,使用rangebased for循环或任何其他STL算法,比如,等等。

  • 在下面的示例中,我想知道为什么不能接受存在量化的类型值,即使可以。 请注意,我在Scala 3中对此进行了测试(在线尝试),但在很大程度上,Scala 2中的问题相同,尽管这个特定示例在Scala 2中还有其他问题。