小编Pan*_*kis的帖子

std::common_reference_with 在元组上的行为不一致。哪个是对的?

背景:

我正在尝试移植一个库以在 MSVC 上进行编译。该库将数据存储在向量元组 ( std::tuple<std::vector<Ts>...>) 中,并使用自定义迭代器同时迭代所有向量(类似于 zip_iterator 的作用)。

迭代器定义的类型如下所示(假设Ts...-> <int, int>):

`value_type` is `std::tuple<int, int>`  
`reference`  is `std::tuple<int&, int&>`
Run Code Online (Sandbox Code Playgroud)

问题是,在最新的 MSVC (v. 19.35) 上,这个迭代器不满足 的概念std::input_iterator,而在 gcc/clang 上却满足它。

经过进一步调查,我发现失败是由于std::common_reference元组上的概念行为不一致造成的。

问题:

以下static_assert内容在 MSVC 上失败,而在 gcc/clang 上不会失败

using T = std::tuple<int, int>&;
using U = std::tuple<int&, int&>;
static_assert(std::common_reference_with<T, U>, "failed common_reference_with");
Run Code Online (Sandbox Code Playgroud)

这是Godbolt上的(还有一个迭代器示例)

问题:

像这样的类型std::tuple<int, int>&应该有一个“ common_reference_withstd::tuple<int&, int&>吗?MSVC 说不,gcc 说可以。
根据 C++20 及以后的标准,这两种行为中的哪一种是预期的?

有没有什么简单的方法可以使这个迭代器成功通过 MSVC 上的迭代器概念检查(即强制这两种类型具有共同的引用)? …

c++ tuples std language-lawyer c++-concepts

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

标签 统计

c++ ×1

c++-concepts ×1

language-lawyer ×1

std ×1

tuples ×1