败犬日报 2025-08-20
1. 为什么 make_shared<A>
返回类型是 shared_ptr<_NonArray<A>>
_NonArray<A>
就是 A,作用是通过返回值的 SFINAE 来匹配非数组类型,可以较少代码兼容没有 requires 的版本。实现可能长这样:
cpp
#if __cpp_concepts && __glibcxx_type_trait_variable_templates
template<typename _Tp>
requires (!is_array_v<_Tp>)
using _NonArray = _Tp;
#else
template<typename _Tp>
using _NonArray = __enable_if_t<!is_array<_Tp>::value, _Tp>;
#endif
2. unordered_map 迭代器用 prev 是未定义行为吗
现象是群友发现本地报错,godbolt 上运行崩溃,这确实是未定义行为。
unordered_map 迭代器是 LegacyForwardIterator,只能向前。
prev 记载了 BidirIt must meet the requirements of LegacyBidirectionalIterator。
3. C++ vector 的 push_back 扩容机制为什么不考虑在尾元素后面的空间申请内存
参考文章:https://www.zhihu.com/question/384869006
关键点是,realloc 接口不灵活,它在原地扩张失败后会自动分配内存并 memcpy 过去,不会调移动构造函数。这就必须要保证对象是 trivially copyable 的。
C++ 还没有类似的函数进入标准,可以看 C++ 中的 relocate 语义 - YKIKO的文章 - 知乎