Gần đây tôi đã chạy băng qua tình huống sau đây:để đánh giá các đối số chức năng và đối số mặc định
#include <iostream>
int *p = 0;
int f() {
p = new int(10);
return 0;
}
void g(int x, int *y = p) {
std::cout << y << std::endl;
}
int main() {
g(f());
}
này khá tinh tế, vì bạn thường không mong đợi các đối số mặc định để thay đổi trong đánh giá của họ đối với cuộc gọi chức năng . Tôi đã phải nhìn vào hội đồng để phát hiện lỗi này.
Bây giờ câu hỏi của tôi là: Hành vi này có thực sự không xác định, vì không có bất kỳ đảm bảo nào liên quan đến thứ tự đánh giá các đối số hàm?
"Đánh giá các đối số mặc định xảy ra trong ngữ cảnh của người gọi" Bạn có tham chiếu trong tiêu chuẩn C++ hiện tại cho xác nhận quyền sở hữu này không? – phlipsy
Có một lưu ý không quy định trong 1.9p11 nói rõ ràng. Ngoài ra, tôi nghĩ nó chỉ được ngụ ý bởi sự thiếu phân biệt với các lập luận khác. –
@phlipsy xem [dcl.fct.default]/9 "Đối số mặc định được đánh giá mỗi khi hàm được gọi. Thứ tự đánh giá hàm số không xác định.", Tôi nghĩ điều này ngụ ý rõ ràng rằng 'g (f()) 'giống như' g (f(), p) ' –