std::make_pair返回的不是std::pair?为何static_assert验证失败?
这个问题的核心藏在constexpr变量的类型推导,以及typeid和decltype的行为差异里:
为什么static_assert会失败?
你定义的pair_of_ints是constexpr变量,它的实际类型是const std::__1::pair<int, int>(带const修饰),但你在static_assert里用来比较的是std::pair<int, int>(不带const)——这两个类型当然不相等,所以断言失败。
而typeid的输出会误导你:因为typeid会忽略类型的const和volatile修饰符,typeid(const std::__1::pair<int,int>)和typeid(std::__1::pair<int,int>)返回的是同一个std::type_info对象,输出的名称自然一致,这就让你误以为两者类型完全相同。
怎么解决?
你只需要去掉decltype(pair_of_ints)结果里的const修饰即可,有几种实用方式:
方法1:用std::remove_const_t(C++14及以上)
修改你的static_assert语句,记得先包含<type_traits>头文件:
#include <type_traits> static_assert(std::is_same<std::remove_const_t<decltype(pair_of_ints)>, std::pair<int, int>>::value, "类型不匹配");
方法2:用std::is_same_v简化写法(C++17及以上)
Clang 8.x已经支持C++17,用is_same_v可以让代码更简洁:
static_assert(std::is_same_v<std::remove_const_t<decltype(pair_of_ints)>, std::pair<int, int>>, "类型不匹配");
方法3:处理更多类型修饰用std::decay_t
如果你的场景中返回值可能带有引用、数组等额外修饰,std::decay_t会一次性处理掉这些(包括const):
static_assert(std::is_same_v<std::decay_t<decltype(pair_of_ints)>, std::pair<int, int>>, "类型不匹配");
针对你函数返回值验证的场景
如果你要验证函数的返回类型,直接用decltype(your_function(args))即可——因为函数返回值本身不会带const(除非你特意返回const std::pair<...>),所以不需要额外处理const修饰。比如:
// 示例函数 auto return_pair() { return std::make_pair(1, 2); } // 验证返回类型 static_assert(std::is_same_v<decltype(return_pair()), std::pair<int, int>>, "返回类型错误");
内容的提问来源于stack exchange,提问作者rubenvb

