我的内部健全性检查失败,所以我在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
,则会失败。我不知道为什么。
我怎样才能做到这一点?我有一个函数,它返回一个对或元组,具体取决于传递给它的参数,并希望验证它在正确的情况下实际返回一对或元组。
答案 0 :(得分:38)
您将pair_of_ints
声明为constexpr
,暗示const
:
对象声明中使用的
constexpr
说明符将对象声明为const
。
所以pair_of_ints
的类型实际上是:
const std::pair<int, int>
typeid
会忽略cv-qualifiers,这就是为什么这些信息不会出现在名称中的原因:
如果表达式的类型或 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);