Skip to content

败犬日报 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。