为什么元组不会收到未使用的变量警告?
在以下示例中,使用 编译时-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,使其不会掩盖警告?
回答
编译器将尽最大努力标志未使用的变量,但是这是很难不平凡的类型,都Bar和std::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** 工作过。好的!