2012-10-02 41 views
9

có cách nào, trong C++, để buộc gán giá trị trả về của hàm không? tức là nếu tôi có một hàm thành viên foolực trả về đối tượng được gán

class myClass{ 
    ... 
    public: 
    T1 foo(T2 x){T1 y; /*something*/ return y;}; 
} 

mà tôi có thể gọi trong main() như

myClass obj; 
T1 a = obj.foo(x); //<-- 

tôi có thể thực hiện cuộc gọi đơn giản hơn

myClass obj; 
obj.foo(x); //<-- 

(mà không lưu trữ giá trị trả lại) bằng cách nào đó "bất hợp pháp"?

Ngoài ra, tôi có thể phân biệt các định nghĩa của

T1 a = obj.foo(x); 
obj.foo(x); 

cảm ơn bạn đã dành thời gian và xin lỗi vì sự thiếu hiểu biết của tôi

+1

Không có gì đặc biệt sai với việc hủy bỏ các giá trị trả lại. Ngoài ra, ngay cả khi có một cách như vậy - những gì về 'somefunc (obj.foo (x))'? – Cubic

+0

Bạn đang cố gắng đạt được điều gì khiến điều này cần thiết? –

Trả lời

3

Không, không có cách nào để buộc một thao tác trên một đối tượng trả lại.

Và không có, bạn không thể phân biệt giữa

T1 a = obj.foo(x); 
obj.foo(x); 

bên trong các cuộc gọi (ít nhất là không theo một cách tiêu chuẩn di động. Bạn có thể hack đi với cuộc gọi ngăn xếp và như vậy, nhưng tại sao bạn) .

2

Không có cách nào để nói, nhưng các công cụ phân tích tĩnh tốt thường hiển thị cảnh báo nếu giá trị trả lại bị bỏ qua. Một trong những tôi sử dụng mà đi kèm với MSVC2010 chắc chắn không.

3

Câu trả lời đơn giản là không; tuy nhiên bạn có thể "ép buộc":

trả lại con trỏ thông minh được tự động hủy khi không có bất kỳ tham chiếu nào. Trong destructor ném một số ngoại lệ hoặc thực hiện một cuộc gọi khẳng định(). Để ngăn ngừa sự cố khi sử dụng đúng, bạn có thể sử dụng một số biến trong lớp đó và đặt nó thành false khi bạn chắc chắn bạn không cần đối tượng nữa và điều đó sẽ báo cho destructor không ném bất cứ thứ gì.

+2

Cơ chế này là tốt đẹp, nhưng tất nhiên là một loại kiểm tra "thời gian chạy". Cảm ơn bạn rất nhiều btw. – Acorbe

7

Nếu bạn đang sử dụng g ++, bạn có thể sử dụng

T1 foo(T2 x) __attribute__ ((warn_unused_result)); 

này sẽ gây ra một cảnh báo, mặc dù không phải là một lỗi. Nhưng bạn có thể sử dụng một số cờ -Werror = * để biến nó thành một lỗi. Xem here cho tất cả các thuộc tính chức năng được hỗ trợ.

+0

Điều này rất gần với những gì tôi cần. Tôi có thể là một chút un-portable mặc dù. Tôi sẽ khám phá theo cách này btw. cám ơn. – Acorbe

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