Почему я получаю предупреждение "параметр, но не используемый" при использовании nullptr_t?

У меня есть пользовательский класс, реализующий 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) дает мне следующее предупреждение:

[[email protected] 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.

Ответ 1

Не действительно ответ на вопрос, почему это происходит, но в любом случае какое значение может иметь n, но nullptr?

Возвращая this->v == nullptr, а аргумент unnamed удаляет предупреждение:

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

EDIT:

Объявление n в качестве ссылки на rvalue или в качестве ссылки на константу lalue также удаляет предупреждение:

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

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

EDIT2:

Больше способов отключить предупреждение о неиспользуемых переменных можно найти в этом вопросе (спасибо @ShafikYaghmour для указания его в комментариях). Приведенные выше примеры охватывают "неявные" способы.

Явные решения доступны, но IMHO выглядят менее согласованными, так как параметр эффективно используется. Протестированные явные решения включают:

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;
}