败犬日报 2025-07-15
1. 面试题:为什么 strcpy 有返回值(返回第一个参数)
方便写 strlen(strcpy(str, "xxx"));
这种花活。
2. 成员变量的构造函数在对象的构造函数之前吗
准确地说是在构造函数的复合语句之前。
https://zh.cppreference.com/w/cpp/language/initializer_list.html:
Before the compound statement that forms the function body of the constructor begins executing, initialization of all direct bases, virtual bases, and non-static data members is finished.
翻译:在构成构造函数体的复合语句开始执行之前,所有直接基类、虚拟基类和非静态数据成员的初始化已经完成。
3. 在构造函数里不能 this->~T()
因为 *this
的生命周期在构造函数执行完才开始。
4. 在构造函数里用 placement new 调用另一个构造函数有问题吗
struct Builder {
int v;
};
class Object {
public:
Object(int v) : v(v) {}
Object(const Builder& builder) { new (this) Object(builder.v); }
private:
int v;
};
应该有问题。如果 Object::v
不是 int 而是 vector 这种申请了资源的类型,就会有资源泄漏。
即使是 int,也会调用两次 Object 构造函数但是只有一次析构。这是不是 UB 群友没提。
如果 this->~T()
再 placement new,这是不行的(前文说了构造函数里不能 this->~T()
),但是在一般的成员函数里是可以的。
5. 群友锐评 C 语言
可读性不行,宏套宏、宏拼接、x-macro 很常见。C 看似语法简单,实则靠奇技淫巧弥补语法缺陷。
6. 父进程怎么关闭子进程
温和一点杀 kill -15
,激进一点杀 kill -9
。
7. gcc 不同版本不同标准,可以互相链接吗
标准选项不影响,gcc 版本可能影响。
https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Dialect-Options.html#index-fabi-version 看这个有没有影响到程序的 abi,有的话要手动指定 abi 版本。
8. 关于找工作的文章,针对偏复杂的方向,例如db、os等
https://www.zhihu.com/question/553813879/answer/1928558622926959988
9. GCC/Clang 模板语境 lambda 是 dependent expression
#include <bits/stdc++.h>
template <typename T>
class Switch {
private:
T value_;
public:
explicit Switch(T value) : value_(value) {}
template <typename U, typename Fn>
Switch& Case(Fn&& fn) {
return *this;
}
};
int main() {
// Regular lambda
auto regularLambda = [](int value) {
Switch<int>(value)
.Case<int>([]() {}) // OK: no template keyword needed
.Case<float>([]() {}); // OK: no template keyword needed
};
// Generic lambda
auto genericLambda = [](auto value) {
Switch<int>(value)
.Case<int>([]() {}) // OK: first call works
.Case<float>([]() {}); // REQUIRED: template keyword needed
};
}
[](auto value) { ... }
内部是模板语境,Clang 把模板语境的 lambda(第一个 []() {}
)当成 dependent expression,导致 Switch<int>(value).Case<int>([]() {})
这个表达式也变成 dependent expression。
删掉 .Case<int>([]() {})
或 .Case<float>([]() {})
都可以过编译。
不过 MSVC 能过编译。