通常情况下,要避免 unused warnings ,可以使用 [[maybe_unused]]。例如下面的程序,去掉 [[maybe_unused]] ,那么就会提示 unused variable 的 warning 。

https://godbolt.org/z/cW3Wsnaqj
1
2
3
int main() {
int x [[maybe_unused]];
}

但并非所以情况都可以使用 [[maybe_unused]] 。例如,遇到 structured binding 的时候,这时候就需要 std::ignore 了。例如下面的程序。

https://godbolt.org/z/G8evhdxvo
1
2
3
4
5
6
7
#include <tuple>

int main() {
auto && [k, v] = std::make_tuple(10, 20);
std::ignore = k;
std::ignore = v;
}

这个程序,如果去掉 st::ignore ,那么 gcc 和 clang 都会给出 unused variable 的 warning 。st::ignore 可以被任意赋值,作用也仅仅只是为了避免 unused 的 warning 。有一个小细节是, gcc 和 clang 遇到 structured binding 的时候,如果其中有一个变量后续被使用了(例如例子中的 kv ),那么就不会提示 unused variable 了。

std::ignore 还可以和 std::tie() 联合使用,用来跳过某个值并且不给出警告。例如:

https://godbolt.org/z/7jzGP819z
1
2
3
4
5
6
7
8
9
10
#include <tuple>
#include <iostream>

int main() {
int v;
std::tie(std::ignore, v) = std::make_tuple(10, 20);
std::cout << v << std::endl;
}

// prints 20