为什么元组不会收到未使用的变量警告?

在以下示例中,使用 编译时-Wall,不会警告一些未使用的变量:

#include <tuple>

struct Foo
{
    int a, b;
};

struct Bar
{
    ~Bar() {}

    int a, b;
};

int three() { return 3; }

int main()
{
    Foo f0 {1, 2};
    Foo f1 {three(), 2};
    Bar b0 {1, 2};
    Bar b1 {three(), 2};
    std::tuple<int, int> p0 {1, 2};
    std::tuple<int, int> p1 {three(), 2};
}
  • clang 12.0.1:bs 并且p1没有收到警告
  • gcc 11.2:bs 和ps 不会收到警告

为什么这些没有得到警告?有没有办法标记析构函数Bar,使其不会掩盖警告?

回答

编译器将尽最大努力标志未使用的变量,但是这是很难不平凡的类型,都Barstd::tuple<int, int>是不平凡的。

static_assert(std::is_trivial_v<Foo>);
static_assert(!std::is_trivial_v<Bar>);
static_assert(!std::is_trivial_v<std::tuple<int, int>>);

如中所述

  • 错误 55203 - 对于非平凡类型的变量没有未使用的警告

由于编译器在某些情况下无法确定,例如 ctor 调用外部函数,我看到的唯一合理的处理方法是显式标记类型,如果只调用 ctor/dtor 则应该有未使用的警告一个变量。这是我对属性 warn_unused 的尝试。

warn_unused如果您希望-Wunused-variable在调用非平凡类型变量的构造函数和/或析构函数时发出a ,则可以使用 GCC 的属性。

struct __attribute__((warn_unused)) Bar {
    ~Bar() {}
    int a, b;
};

int main() {
    Bar b{1, 3}; // warning: unused variable 'b' [-Wunused-variable]
}

  • 也为 **clang** 工作过。好的!

以上是为什么元组不会收到未使用的变量警告?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>