Проблема, с которой я сталкиваюсь, - это то, где компилятор жалуется на неиспользуемую переменную, даже если эта переменная используется, но она используется только в расширении пакета параметров, которое бывает пустым для конкретного экземпляра. Например:
template <std::size_t... I>
auto func1(std::index_sequence<I...>)
{
auto var = get_tuple();
return func2(std::get<I>(var)...);
}
auto a = func1(std::make_index_sequence<0>());
См. живой пример (попробуйте изменить кортеж в строке 4, добавив int внутри < > , чтобы увидеть предупреждение).
Я знаю, что я мог бы добавить строку (void)var;
, чтобы предупреждение исчезло, но мне кажется, что это грязно, особенно когда функция на самом деле представляет собой только одну строку.
Я также не хочу отключать это предупреждение во всем мире, потому что он иногда дает представление.
Аналогичное проявление этой проблемы заключается в том, когда переменная используется в лямбда-захвате. В этом случае gcc не дает никакого предупреждения, в то время как clang жалуется (я думаю, gcc никогда не реализовал предупреждение о неиспользуемых лямбда-захватах):
template <std::size_t... I>
auto func1(std::index_sequence<I...>)
{
auto var = get_tuple();
auto my_lambda = [var](){
return func2(std::get<I>(var)...);
};
return my_lambda();
}
auto a = func1(std::make_index_sequence<0>());