Hàm void không trả về giá trị, nhưng câu lệnh return vẫn hợp lệ và hữu ích.
1. return; – Thoát sớm khỏi hàm
Dùng để kết thúc hàm trước khi chạy hết thân hàm, tăng readability.
void process(int x) {
if (x < 0) return; // guard clause
// xử lý x >= 0
cout << "Processing " << x << endl;
}
2. return expr; – expr phải là void
Có thể return một biểu thức kiểu void – ví dụ gọi hàm void khác:
void logError() { cerr << "Error!\n"; }
void handle() {
if (error) return logError(); // OK: logError() trả void
}
3. Lambda void trả về void expression
auto lambda = []() -> void {
if (cond) return;
return []{ cout << "done\n"; }(); // gọi lambda void khác
};
4. Template và decltype
template<typename F>
auto wrapper(F f) -> decltype(f()) { // C++14 return type deduction
return f(); // OK nếu f() trả void
}
Ví dụ tổng hợp
#include <iostream>
using namespace std;
void cleanup() { cout << "Cleanup\n"; }
void process(int id) {
if (id <= 0) {
cout << "Invalid ID\n";
return; // thoát sớm
}
cout << "Processing " << id << endl;
return cleanup(); // gọi void func khác rồi return
}
int main() {
process(1); // Processing 1 \n Cleanup
process(-1); // Invalid ID
return 0;
}
Kết quả
Processing 1 Cleanup Invalid ID
Lưu ý
return 0;trong hàm void → lỗi compile.return nullptr;cũng lỗi (nullptr không phải void).- C++11:
void_ttrait hỗ trợ SFINAE với void expression.