在具有重复类型的 std::tuple 中按类型访问应产生编译错误

Access by type in std::tuple with duplicated types should produce compilation error

提问人:ocirocir 提问时间:7/12/2021 更新时间:7/12/2021 访问量:117

问:

根据标准(或至少是 cppreference),std::tuple 的 std::get 应:

5-8) 提取类型为 T 的元组 t 的元素,除非该元组正好有一个该类型的元素,否则无法编译。

所以我对这句话的解释是,这个代码不编译:

std::tuple<int, int> my_record;
std::get<int>(my_record) = 10;

因为存在两个相同的类型,我尝试按类型访问元组。但是,GCC 和 Clang 都正确地编译了此代码并产生了修改第一个元素的效果

为什么?我是否误解了参考文献上的句子?引用错误吗?GCC 和 Clang 不尊重标准吗?

C++ C++14 标准

评论

2赞 Richard Critten 7/12/2021
无法为我编译 godbolt.org/z/c15Ef3MP9 有趣的是,它会随着编译器版本而变化。Clang 11.0.1 和 GCC 10.3 编译失败;更高版本编译它。
0赞 Jarod42 7/12/2021
libstdc++ 似乎确实有一个错误,libc++ 通过 Demo(库中的错误而不是编译器)。

答:

4赞 HolyBlackCat 7/12/2021 #1

看起来像 GCC 11 错误,请考虑提交它。这是该标准的启示性部分

你在 Clang 中看到它,因为 gcc.godbolt.org 它默认使用 GCC 的标准库。如果你添加使用它自己的标准库,它会拒绝编译它。-stdlib=libc++

评论

3赞 ocirocir 7/12/2021
提交的错误: gcc.gnu.org/bugzilla/show_bug.cgi?id=101427 ;)