Skip to content

败犬日报 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 调用另一个构造函数有问题吗

cpp
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

cpp
#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 能过编译。