2016-11-24 20 views
11

Tôi có một lớp tùy chỉnh triển khai operator== với nullptr.Tại sao tôi nhận được cảnh báo "đặt tham số nhưng không được sử dụng" khi sử dụng nullptr_t?

Dưới đây là mã của tôi dumbed xuống thành một ví dụ đơn giản:

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

Mã này hoạt động như mong đợi nhưng g ++ (phiên bản 6.2.1) mang lại cho tôi những cảnh báo sau đây:

[[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 { 
            ^

gì am Tôi làm sai?

LƯU Ý: Tôi đang sử dụng -Wall -Wextra.

+0

Không thể sinh sản. Không có cảnh báo nào với gcc 6.2.1 –

+3

@SamVarshavchik try -Wall -Wextra. Có thể sao chép trên 6.1 của hộp thư đến: http://melpon.org/wandbox/permlink/OGeniUkFzE8dRP1v – krzaq

+1

Thú vị. Lưu ý rằng bạn có thể câm nó sâu hơn nữa: '#include int main() {std :: nullptr_t n = nullptr; if (n == nullptr) std :: cout << "có"; } ' –

Trả lời

9

Không thực sự là câu trả lời về lý do điều này xảy ra, nhưng dù sao giá trị nào có thể có n nhưng nullptr?

Trở this->v == nullptr và làm cho lập luận giấu tên loại bỏ các cảnh báo:

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

EDIT:

Tuyên bố n như một tài liệu tham khảo rvalue, hoặc như là một tài liệu tham khảo giá trị trái const cũng loại bỏ các cảnh báo:

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

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

EDIT2:

Có thể tìm thấy nhiều cách khác để tắt tiếng cảnh báo về các biến không sử dụng trong this question (thx @ShafikYaghmour để chỉ báo trong nhận xét). Các ví dụ trên bao gồm các cách "ẩn".

Các giải pháp rõ ràng có sẵn, nhưng IMHO trông kém chặt chẽ hơn khi thông số được sử dụng hiệu quả. Thử nghiệm các giải pháp rõ ràng bao gồm:

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

giải pháp di động không cho GCC:

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

Nếu đó không phải là câu trả lời, thì IMO phải là nhận xét. –

+7

Tôi thực sự tin rằng * này là * một câu trả lời, vì nó cung cấp một cách rất hợp lý để tránh cảnh báo. Sử dụng một định danh cho một đối tượng kiểu 'std :: nullptr_t' là vô nghĩa. – Angew

+1

Tôi đồng ý, đây là câu trả lời hợp lệ. –

Các vấn đề liên quan