Как предотвратить предупреждение неиспользуемой переменной с нетривиальным деструктором
Когда я полагаюсь на расширение продолжительности жизни для назначения классу с нетривиальным деструктором, компилятор (как gcc, так и clang) выдает неиспользуемые предупреждения переменных. Есть ли способ обойти это? https://wandbox.org/permlink/qURr4oliu90xJpqr
#include <iostream>
using std::cout;
using std::endl;
class Something {
public:
explicit Something(int a_in) : a{a_in} {}
Something() = delete;
Something(Something&&) = delete;
Something(const Something&) = delete;
Something& operator=(Something&&) = delete;
Something& operator=(const Something&) = delete;
~Something() {
cout << this->a << endl;
}
private:
int a;
};
int main() {
const auto& something = Something{1};
return 0;
}
Обратите внимание, что когда я переключаюсь не на продление жизни, все работает просто отлично https://wandbox.org/permlink/cJFwUDdi1YUEWllq
Я даже попытался вручную определить все конструкторы и затем удалить их с шаблоном static_assert
, чтобы он запускался только тогда, когда эти конструкторы называются https://wandbox.org/permlink/fjHJRKG9YW6VGOFb
#include <iostream>
using std::cout;
using std::endl;
template <typename Type>
constexpr auto definitely_false = false;
template <typename T = void>
class Something {
public:
explicit Something(int a_in) : a{a_in} {}
Something() { static_assert(definitely_false<T>, ""); }
Something(Something&&) { static_assert(definitely_false<T>, ""); }
Something(const Something&) { static_assert(definitely_false<T>, ""); }
Something& operator=(Something&&) { static_assert(definitely_false<T>, ""); }
Something& operator=(const Something&) { static_assert(definitely_false<T>, ""); }
~Something() {
cout << this->a << endl;
}
private:
int a;
};
int main() {
const auto& something = Something<>{1};
return 0;
}
Скажем, просто для словаря адвоката языка, что литье в пустоту не является вариантом. Могу ли я что-то сделать с конструкторами/деструкторами, которые помогут отключить это предупреждение?
Ответы
Ответ 1
Не тот точный ответ, который вы ищете, но вот обходное предложение:
Pre С++ 17
Используйте std::ignore
следующим образом:
const auto& something = Something{1};
std::ignore = something;
Post С++ 17
Используйте maybe_unused
attibute, например:
[[maybe_unused]] const auto& something = Something{1};
Ответ 2
С++ 17 представил maybe_unused
attribute, что может помочь в вашем случае. Его можно применить к переменной, чтобы указать, что она может не использоваться:
[[maybe_unused]] const auto & something = Something<>{1};
Ответ 3
Я использую анонимный объект Something, и ваше предупреждение исчезло...
int main()
{
Something{1};
return 0;
}
https://wandbox.org/permlink/YcuLPFzgOSzltVSq
Компилятор предупреждает вас, что ссылочная переменная объекта Something не используется. Это верно, что бы вы ни делали с конструктором и деструктором. Поэтому, если вы не используете ссылочную переменную, не создавайте ее. Это эффективно предотвращает предупреждение.