【问题标题】:Why am I getting a "parameter set but not used" warning when using nullptr_t?为什么在使用 nullptr_t 时会收到“参数集但未使用”警告?
【发布时间】:2016-11-24 15:38:13
【问题描述】:

我有一个自定义类实现operator==nullptr

这是我的代码简化为一个简单的示例:

#include <cstdint>
#include <iostream>

class C {
private:
    void *v = nullptr;

public:
    explicit C(void *ptr) : v(ptr) { }

    bool operator==(std::nullptr_t n) const {
        return this->v == n;
    }
};

int main()
{
    uint32_t x = 0;
    C c(&x);
    std::cout << (c == nullptr ? "yes" : "no") << std::endl;

    C c2(nullptr);
    std::cout << (c2 == nullptr ? "yes" : "no") << std::endl;


    return 0;
}

代码按预期工作,但 g++(6.2.1 版)给了我以下警告:

[Timur@Timur-Zenbook misc]$ g++ aaa.cpp -o aaa -Wall -Wextra
aaa.cpp: In member function ‘bool C::operator==(std::nullptr_t) const’:
aaa.cpp:12:36: warning: parameter ‘n’ set but not used [-Wunused-but-set-parameter]
     bool operator==(std::nullptr_t n) const {
                                    ^

我做错了什么?

注意:我使用的是-Wall -Wextra

【问题讨论】:

  • @SamVarshavchik 尝试 -Wall -Wextra。可在 wandbox 的 6.1 上重现:melpon.org/wandbox/permlink/OGeniUkFzE8dRP1v
  • 有趣。请注意,您可以进一步简化它:#include &lt;iostream&gt; int main() { std::nullptr_t n = nullptr; if (n == nullptr) std::cout &lt;&lt; "yes"; }
  • @wasthishelpful:也许 GCC 在此处生成警告时证明是正确的,但措辞 “参数集但未使用” 肯定还有很多不足之处。跨度>
  • n=n; 添加到函数中会使警告消失。看起来编译器知道n 可以是NULL,并简单地优化对它的引用,然后最终产生警告。
  • nullptr_t 对象上的左值到右值转换不会访问其存储的值。无论如何都应该提交一个错误。

标签: c++ c++11 g++ warnings nullptr


【解决方案1】:

没有真正回答为什么会发生这种情况,但无论如何nnullptr 可能有什么价值?

返回 this-&gt;v == nullptr 并将参数设为未命名会删除警告:

bool operator==(std::nullptr_t) const {
    return this->v == nullptr;
}

编辑:

n 声明为右值引用或 const 左值引用也会删除警告:

bool operator==(std::nullptr_t&& n) const {
    return this->v == n;
}

bool operator==(const std::nullptr_t& n) const {
    return this->v == n;
}

EDIT2:

可以在this question 中找到更多消除未使用变量警告的方法(感谢@ShafikYaghmour 在 cmets 中指出它)。上面的示例涵盖了“隐式”方式。

可以使用显式解决方案,但恕我直言,由于有效使用了参数,因此看起来不太连贯。经过测试的显式解决方案包括:

bool operator==(std::nullptr_t n) const {
    (void)n;
    return this->v == n;
}

#define UNUSED(expr) do { (void)(expr); } while (0)

bool operator==(std::nullptr_t n) const {
    UNUSED(n);
    return this->v == n;
}

GCC 的非便携式解决方案:

bool operator==(__attribute__((unused)) std::nullptr_t n) const {
    return this->v == n;
}

【讨论】:

  • 如果不是答案,那么 IMO 应该是评论。
  • 我实际上相信这 一个答案,因为它提供了一种非常合理的方法来避免警告。为std::nullptr_t 类型的对象使用标识符是毫无意义的。
  • 我同意,这是一个有效的答案。
  • 但是,这种情况可能发生在std::nullptr_t实际上是一个类型参数的模板中。
  • 我对这个答案有疑问。如果我删除参数名称并与nullptr 进行比较:如果有人将非空指针投射到nullptr_t 怎么办?
猜你喜欢
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 2022-06-19
相关资源
最近更新 更多