当我依赖生命周期扩展来分配具有非平凡析构函数的类时,编译器(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;
}
我们只是为了语言律师的标记而说,转换为无效不一个选项。我可以使用构造函数/析构函数来帮助消除此警告吗?
答案 0 :(得分:1)
C ++ 17引入了maybe_unused
attribute,这可能会对你的情况有所帮助。它可以应用于变量以指示它可能未被使用:
[[maybe_unused]] const auto & something = Something<>{1};
答案 1 :(得分:-1)
我只是使用一个匿名的Something对象,你的警告就消失了......
int main()
{
Something{1};
return 0;
}
https://wandbox.org/permlink/YcuLPFzgOSzltVSq
编译器警告您Something的对象引用变量未使用。无论你使用构造函数和析构函数做什么,都是如此。因此,如果您不使用引用变量,请不要创建它。这有效地防止了警告。