如何使用非平凡的析构函数防止未使用的变量警告

时间:2017-11-13 06:02:37

标签: c++ c++11 language-lawyer destructor raii

当我依赖生命周期扩展来分配具有非平凡析构函数的类时,编译器(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;
}

我们只是为了语言律师的标记而说,转换为无效一个选项。我可以使用构造函数/析构函数来帮助消除此警告吗?

2 个答案:

答案 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的对象引用变量未使用。无论你使用构造函数和析构函数做什么,都是如此。因此,如果您不使用引用变量,请不要创建它。这有效地防止了警告。