Skip to content

败犬日报 2025-06-03

1. 关于 char8_t 的发明动机

https://stackoverflow.com/questions/57402464/is-c20-char8-t-the-same-as-our-old-char

提案作者说:

  1. 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.
  2. To enable overloading for ordinary string literals vs UTF-8 string literals (since they may have different encodings).
  3. To ensure an unsigned type for UTF-8 data (whether char is signed or unsigned is implementation defined).
  4. 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 fixgit commit --amend

都可以,保证每个 commit 的原子性就好。最后以什么粒度组合是 maintainer 的事情。

3. C++ 中文周刊 2025-06-02 第185期

https://zhuanlan.zhihu.com/p/1913050890824324660

群友讨论了这个代码:

类成员用完就丢

cpp
class 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 的位置。