Tại sao mã sau đây biên dịch mà không có cảnh báo. Lưu ý rằng blablabla() không được xác định ở bất kỳ đâu.Tại sao "std :: string (blablabla());" biên dịch mà không có lỗi?
Tôi đã thử nghiệm nó trong gcc 5.1.0
và clang-3.7.0
(có và không có cờ -std = C++ 11).
#include <string>
int main()
{
std::string(blablabla());
}
câu hỏi này là không một bản sao của gây nhiều tranh cãi nhất phân tích cú pháp mơ hồ, vì ví dụ có liên quan tuyên bố chức năng với một tham số.
Nếu tôi đặt cược đoán, câu lệnh được tối ưu hóa, vì bạn chỉ đơn giản là không sử dụng nó theo bất kỳ cách nào. Bạn không chỉ định chuỗi cho biến và bạn cũng không chuyển nó cho hàm. Như vậy trình biên dịch cũng có thể được 'nhìn' nó. Nhưng đó là một dự đoán. –
Cảnh báo phải độc lập với * bất kỳ * tối ưu hóa nào, trong bất kỳ trình biên dịch gần đây nào. – Kamajii
Err, nếu 'blablabla()' là một hàm thực hiện 'cout <<" Xin chào \ n ";', thì tối ưu hóa đó sẽ hoạt động như thế nào? Tôi chắc chắn bạn không được phép tối ưu hóa mã theo cách mà về cơ bản nó thay đổi hành vi. Trong mọi trường hợp, nó không thực sự * gọi * 'blablabla', không có sự khác biệt giữa câu lệnh đó và một với dấu ngoặc đơn bên ngoài bị loại bỏ. – paxdiablo