gpt4 book ai didi

c++ - 这是 C++ 中的一个缺陷,即 std::get ( const std::pair& ) 由于 const T 而无法编译吗?

转载 作者:可可西里 更新时间:2023-11-01 18:24:20 24 4
gpt4 key购买 nike

如题。

此编译错误发生在使用 std::get<T>(pair) 时,其中该对的第一个成员是一个常量,来自 std::map 的迭代器或 std::unordered_map .

要测试编译错误,请注释掉 get 的“notstd”重载.

我已经在 Stack Overflow 上用下面列出的三个最相关的问题研究了这个问题。

现有的答案让我相信它应该是一个缺陷报告,相应的 std::get应该将重载添加到标准库中,并且应该扩展应用于临时常量引用的自动生命周期扩展以涵盖此类情况。

我也研究过它是否与布局特化有关(问题 14272141,链接如下)。但是,我的代码片段只要求对两个成员之一的 const 引用;即使布局专门化,对任一成员的 const 引用仍应存在。

我知道在 const std::pair<T, U>& 之间进行转换和 const std::pair<const T, U>&根据现有答案,这并不安全。

namespace notstd
{
template <class T, class U>
const T& get(const std::pair<const T, U>& tu)
{
return tu.first;
}
}
int test(int value)
{
using namespace notstd;
using namespace std;
const std::pair<const int, bool> one(value, false);
const auto two = get<int>(one);
const auto three = get<const int>(one);
return 0;
}

相关性高的问题:

(谦虚声明:尽管我声称这看起来像是一个缺陷报告,但我脑子里可能缺少一些知识,所以请告诉我。从下面 rioki 的回答中,我可以看出当前的设计允许区分std::pair<const int, int> 中的两个参数,而我的提议将失败。)

我对现状的描述:

  • 令人讨厌的不一致,因为当两个习语(typed-get,以及一致使用来自 vector<pair>unordered_map<pair> 的 range-based-for)一起使用时,就会出现问题,并且对这种不兼容性的解释并不完全令人满意给任何人,包括初学者和有经验的程序员。
  • 如 rioki 的回答中所述,存在一种或多种令人满意的解决方法。
  • 也许没有那么多缺陷报告(因为现有代码可能依赖于区分 const intint 的能力),或者如果不破坏现有代码就无法改进它。

最佳答案

Is this a defect in C++ that std::get<T>(const std::pair<const T, U>& ) fail to compile due to const T?

没有。我非常希望这会失败:

std::pair<const int, bool> p(42, true);
std::get<int>(p); // expected failure

std::get<T>表示检索类型为 T 的元素.不是类型近似于 T 的元素, 或衰减到 T ,或任何其他类似的。 std::get来到pair通过 tuple , 它在哪里 specified as :

Requires: The type T occurs exactly once in Types.... Otherwise, the program is ill-formed.

如果我们考虑 pair作为 tuple 的特例, int{const int, bool} 中不会恰好出现一次,所以程序应该是病式的。

换句话说:你要的是 int在那对中,但没有 int那里。有一个const int还有一个bool .

关于c++ - 这是 C++ 中的一个缺陷,即 std::get<T> ( const std::pair<const T, U>& ) 由于 const T 而无法编译吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48509354/

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