【问题标题】:Why does std::make_pair not return a pair? Or does it?为什么 std::make_pair 不返回一对?或者是吗?
【发布时间】:2018-07-08 01:27:20
【问题描述】:

我的内部完整性检查失败,所以我在 Stackoverflow 上重新运行它。

以下代码:

#include <iostream>
#include <typeinfo>
#include <utility>

int main()
{
    constexpr auto pair_of_ints = std::make_pair(1, 2);
    std::cerr << typeid(pair_of_ints).name();
    //static_assert(std::is_same<decltype(pair_of_ints), std::pair<int, int>>::value, "WTF");
}

在我的系统 (XCode Clang 8.x) 上为 std::__1::pair&lt;int, int&gt; 生成损坏的符号名称。

如果我随后启用static_assert,它会失败。我不知道为什么。 我怎样才能使这项工作?我有一个函数根据传递给它的参数返回一对或元组,并想验证它是否在正确的情况下实际返回一对或元组。

【问题讨论】:

  • 提示:pair_of_intsconst
  • 你可以使用template &lt;typename&gt; struct DebugType;,然后DebugType&lt;decltype(pair_of_ints)&gt; d; 来获得带有真实类型的错误信息。

标签: c++ c++11 std-pair static-assert


【解决方案1】:

您将pair_of_ints 声明为constexpr,这意味着const

[dcl.constexpr]#9

对象声明中使用的constexpr 说明符将对象声明为const

所以pair_of_ints的类型其实是:

const std::pair<int, int>

typeid 忽略 cv-qualifiers,这就是为什么名称中没有出现此信息的原因:

[expr.typeid]#5

如果表达式的类型或 type-id 是 cv 限定类型,则 typeid 表达式的结果引用代表 cv 不限定类型的 std::type_info 对象。

您可以针对 const 限定类型进行测试,或者使用 std::remove_const_t 删除 const 限定符:

static_assert(std::is_same<decltype(pair_of_ints), 
                           const std::pair<int, int>>::value);
static_assert(std::is_same<std::remove_const_t<decltype(pair_of_ints)>, 
                           std::pair<int, int>>::value);

【讨论】:

  • 还可以使用std::remove_cv 删除类型(C++11 起)中的 CV 限定符
  • @JorgeBellón -- 为了完整起见,可以从 C++11 之前的类型中删除 CV 限定符。这是一个相当简单的模板使用。 C++11 将这些模板添加到标准库中,使其更易于访问。
  • @PeteBecker 你是对的。实际上,我把对标准的引用放在链接之前而不是之后,实际上弄乱了措辞。
猜你喜欢
  • 1970-01-01
  • 2019-09-16
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
相关资源
最近更新 更多