G++ 标志以防止使用未初始化的继承属性

G++ flag to protect against use of uninitialized inherited properties

如何让 g++ 保护我免受将未初始化的父属性用于子构造函数?

struct A {
    A(int typ): type{typ} {}
    const int type;
};

struct B : public A {
    B(int typ): A(type) {}
};

int main() {
    B b{3};
    return 0;
}

你能看到这里的错误吗,它有多棘手? 这里我们构建了一个 B 的实例,以 3 作为参数,我们期望 typeA 的值是 3,对吗?但是我们在 B 构造函数中犯了一个输入错误,我们没有将接收到的参数的内容传递给 A 而是已经在 A::type 中的值的内容。在 B 构造函数中查看 typtype 的区别。

那么我怎样才能使 g++ 使我对此感到温暖呢?因为它不应该被允许,A 还没有被初始化,我们不应该能够访问 A 属性。

要使用的标志是 -Wuninitialized,它已嵌入 -Wextra-Wall

但就我而言,我在 c++14 模式下使用 gcc-6.4。 使用此 gcc 版本,您必须使用标志、启用优化并使用已使用未初始化变量初始化的变量。 只有当所有这些条件都已完成时,gcc 才会警告您使用了未初始化的变量。

您可以在这里看到:https://compiler-explorer.com/z/q53sYr - 如果我删除 -O2 标志或 b.type 上的最后一个条件,gcc 将不会警告我们。

正如手册页所说 (https://man7.org/linux/man-pages/man1/g++.1.html) :

Note that there may be no warning about a variable that is used only to compute a value that itself is never used, because such computations may be deleted by data flow analysis before the warnings are printed.