败犬日报 2025-04-17
1. 变量模板全特化不能有 thread_local 之外的存储说明符
主要是 extern,static 这两个存储说明符。
cpp
template<typename T> extern T value; // 主模板声明
template<typename T> extern T value<T*>; // 偏特化声明
template<> extern int value<int>; // 全特化声明(GCC 报错,Clang 警告)
因为标准不让这么做。http://eel.is/c++draft/temp.expl.spec#2
看起来是当初存储说明符考虑的只有类模板静态数据成员,变量模板一直没加,后来只是多允许了 thread_local。
解决办法很显然,用类模板静态数据成员。
2. priority_queue<unique_ptr<T>>
push 进去就出不来了
没错,top()
返回值是 const T&
无法移动,pop()
又没有返回值。
如果强行用 const_cast 并移动出来,就破坏堆的性质了。pop()
等函数要满足堆的性质,所以是未定义行为。
建议用 std::make_heap
代替 priority_queue
。
3. cmake 这东西有大毒
文档看了和没看一样,问 AI 给出错误答案。
一个 api 十万个功能,点名批评 FILE。