败犬日报 2025-06-03
1. 关于 char8_t 的发明动机
https://stackoverflow.com/questions/57402464/is-c20-char8-t-the-same-as-our-old-char
提案作者说:
- To provide a distinct type for UTF-8 character data vs character data with an encoding that is either locale dependent or that requires separate specification.
- To enable overloading for ordinary string literals vs UTF-8 string literals (since they may have different encodings).
- To ensure an unsigned type for UTF-8 data (whether char is signed or unsigned is implementation defined).
- To enable better performance via a non-aliasing type; optimizers can better optimize types that do not alias other types.
第 4 点才是往期提到的严格别名优化,所以之前有一些不严谨,这里纠正一下。
2. 提 PR 要求修改,应该继续提交还是覆盖
git commit -m fix
或 git commit --amend
?
都可以,保证每个 commit 的原子性就好。最后以什么粒度组合是 maintainer 的事情。
3. C++ 中文周刊 2025-06-02 第185期
https://zhuanlan.zhihu.com/p/1913050890824324660
群友讨论了这个代码:
类成员用完就丢
cppclass Widget { std::vector<int> data_; public: auto getData() { return std::move(data_); // 必须!避免拷贝 } };
一是名字不太好,get 不应该修改成员。
二是什么情况会用到,回答是 builder。一般 builder 用于 inplace 构造,往往构造函数要传一个存输出结果的引用。但是有时候,嫌麻烦,直接把输出结果放 builder 里面,之后再 move 拿走。
4. 返回 const std::string&
局部变量的错误实践
cpp
std::string f() {
const std::string &ret = ...; // 应改为 std::string ret = ...;
return ret;
}
const std::string&
局部变量会阻止 RVO,多一次拷贝。改成 std::string
就行了。
5. 可以不用右值引用吗
相当于回到 C++11 之前。进出容器会用到移动;还有不能拷贝的类型比如 unique_ptr
会很难用。
6. 头文件的模板,源文件用错 clangd 不提示
其实是可以的,只是 clangd 会把文件开头的几个头文件构建成 PCH,并且构建的时候 skip function body,所以表现为头文件里面的不会报错,实际上函数定义都整个跳过了,只会实例化声明。
可以试一下把 #include
放到代码中间,这样会报错。但是这样错误会收束到 #include
的位置。