败犬日报 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
这些类型确实很混乱。