2012-12-13 18 views
7

Tôi chỉ cần chạy qua cảnh báo sau đây trong GCC:GCC cảnh báo về dereference ngầm

warning: implicit dereference will not access object of type ‘volatile util::Yield’ in statement [enabled by default] 

khi biên dịch mã này:

volatile util::Yield y1; 
util::Yield y2; 
y1 += y2; // <--- Warning triggered here. 

và tiếc là tôi không hoàn toàn hiểu những gì GCC đang cố gắng để nói tôi ...

Lợi nhuận của lớp được khai báo như sau:

class Yield { 
public: 
    Yield(); 

    Yield &operator+=(Yield const &other); 
    Yield &operator+=(Yield const volatile &other); 
    Yield volatile &operator+=(Yield const &other) volatile; 
    Yield volatile &operator+=(Yield const volatile &other) volatile; 

    // Other operators snipped... 
}; 

Bất kỳ ý tưởng nào?

Cảm ơn!

+0

cảnh báo này nên lỗi thời đối với C++ 11 vì trong C++ 11, giá trị của một cuộc gọi hàm sẽ không được đọc nữa. –

Trả lời

5

Từ hướng dẫn GCC, Section 6.1 - When is a Volatile Object Accessed?

Khi sử dụng một tham chiếu đến biến động, G ++ không đối xử với biểu thức tương đương như truy cập đến các chất bay hơi, nhưng thay vì đưa ra một cảnh báo rằng không dễ bay hơi được truy cập. Lý do cho điều này là nếu không sẽ trở nên khó khăn để xác định nơi truy cập dễ bay hơi xảy ra, và không thể bỏ qua giá trị trả về từ các hàm trả về các tham chiếu dễ bay hơi. Một lần nữa, nếu bạn muốn ép buộc đọc, hãy đưa tham chiếu đến một giá trị.

Cảnh báo xuất phát từ thực tế rằng + = toán tử trả về một tài liệu tham khảo đến một đối tượng không ổn định, và rằng biểu thức 'y1 + y2 =' bỏ qua rằng giá trị trả về. Trình biên dịch cho bạn biết rằng tham chiếu sẽ không thực sự bị hủy tham chiếu (tức là giá trị dễ bay hơi sẽ không được đọc).

+3

Và nếu bạn không muốn ép buộc đọc, làm cách nào để viết mã để tránh cảnh báo? –

+1

@BenVoigt: 'void operator = (Lợi nhuận const & khác) dễ bay hơi;' –

+0

Không có giá trị trả về nào cả không phải là giải pháp tốt. Điều gì sẽ xảy ra nếu nó được sử dụng trong một số ngữ cảnh và không phải là ngữ cảnh khác? –