Skip to content

败犬日报 2025-05-12

1. C++26 反射都能干什么

https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2996r12.html#examples

2. @#$ 以及反引号在 C++ 有用到吗

# 是宏。

@# 和反引号刚刚在 C++26 加进来,但是 @ 被 Objective-C 占了。

$ 可以作为变量名了。(错误的,标准不允许,只是编译器扩展)

反引号似乎还没用到。

3. [[]] 什么时候能自定义

annotation 提案:https://wg21.link/p3394

4. struct 和 class 的区别

只有默认可访问性(public / protected / private),包括成员可访问性和继承时的可访问性。

对于 MSVC 还有 ABI 差异。

5. 群友用 C++ 写什么

大多数都是写数据库内核、自动驾驶算法、编译器、芯片、微信的后端等。

QT 和 UE 有自己的一套,和其他方向差别较大。

6. char8_t 与严格别名的问题

6.1. 严格别名的一个例子

https://godbolt.org/z/76Gznhd3c

cpp
#include <chrono>
#include <iostream>

void sum_with_aliasing(unsigned char* data, int& result) {
    for (int i = 0; i < 1000000; ++i) {
        result += data[0];
    }
}

void sum_without_aliasing(char8_t* data, int& result) {
    for (int i = 0; i < 1000000; ++i) {
        result += data[0];
    }
}

unsigned char 可以有别名,所以不能假设 data 和 result 内存不重叠;char8_t 就可以。

6.2. 编译器为什么假设 signed char 有别名

为了兼容 C。

C++ 允许别名的类型是 char unsigned char std::byte,C 是 char unsigned char signed char,这里有一些区别。编译器如果不做这个兼容,C 代码直接移植到 C++ 就寄了。

6.3. 为什么要有 char8_t

char, unsigned char, signed char 都不能做严格别名优化,只有 char8_t 是独立类型。这样性能会好一些。

https://www.zhihu.com/question/1904806645999047234/answer/1905396078708228989

这些类型确实很混乱。