为什么std :: make_pair不返回一对?或者是吗?

时间:2018-01-29 11:05:22

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

我的内部健全性检查失败,所以我在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");
}

在我的系统上生成std::__1::pair<int, int>的受损符号名称(XCode Clang 8.x)。

如果我然后启用static_assert,则会失败。我不知道为什么。 我怎样才能做到这一点?我有一个函数,它返回一个对或元组,具体取决于传递给它的参数,并希望验证它在正确的情况下实际返回一对或元组。

1 个答案:

答案 0 :(得分:38)

您将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);