Когда я полагаюсь на расширение продолжительности жизни для назначения классу с нетривиальным деструктором, компилятор (как 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;
}
Скажем, просто для словаря адвоката языка, что литье в пустоту не является вариантом. Могу ли я что-то сделать с конструкторами/деструкторами, которые помогут отключить это предупреждение?