Skip to content

败犬日报 2025-01-27

1. lambda 表达式模板怎么显式指定模板参数

要用 operator() 如下:

cpp
auto f = []<typename T>() {};
f<int>();  // 编译错误
f.operator()<int>();  // ok

一个表达式只有是函数模板 / 变量模板时后面才可以接 <>,否则 < 会被当成小于号。

2. 关于是否禁止用 goto

《goto statement considered harmful》 —— Dijkstra

C 使用 goto 是合理的,因为没有异常也没有 RAII,还要管理资源、错误处理,goto 是最简单的方法。linux kernel 就有很多 goto。当然不能滥用,能不用就不用原则。

但是到了 C++ 有了上述的机制,goto 显得没必要了。

3. kafka 是 java 写的,不考虑用 C++ 扣性能吗

大数据组件基本上都是 java/scala,基本没那么需要性能。

常规业务如果要高性能消息队列就需要别的了。

4. 为什么不能在类中初始化静态成员变量

ODR 问题,详见 https://zh.cppreference.com/w/cpp/language/definition

静态成员变量是声明,不能是定义,否则在多个编译单元里就会有多个定义。

想要类内初始化,可以用 inline。

5. 龙年工作日最后一天,From DeepSeek,展望蛇年 - Dio-晶的文章 - 知乎

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

6. 锐评 rust 内存安全

好的设计应该防止用户干傻事。

但是对于高手来说,在一些场景下就会变成 overhead。

7. 简历写精通 C++ 吗,还是熟练使用

问题不大,水平一问便知。

8. 函数形参的生命周期

cpp
#include <cstring>
#include <memory>
#include <iostream>
#include <string>
#include <vector>

class Resource {
    char _records;
public:
    Resource(char c): _records(c) {}
    ~Resource() {
        std::cout << _records << '\n';
    }
};

using Unique = std::unique_ptr<Resource>;
Unique reset(Unique ptr) {
    return std::make_unique<Resource>('b');
}
void drop(Unique ptr) {}
int main() {
    drop(reset(std::make_unique<Resource>('a')));
    return 0;
}

这个代码在 GCC 14.2 输出 b a,在 x86 msvc 19.30 输出 a b。

这是因为函数形参的生命周期是在函数末尾结束还是在全表达式末尾结束,这个东西是实现定义的。

https://wg21.link/cwg2850