Как предотвратить предупреждение неиспользуемой переменной с нетривиальным деструктором

Когда я полагаюсь на расширение продолжительности жизни для назначения классу с нетривиальным деструктором, компилятор (как 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 не используется. Это верно, что бы вы ни делали с конструктором и деструктором. Поэтому, если вы не используете ссылочную переменную, не создавайте ее. Это эффективно предотвращает предупреждение.