Hãy xem xét một lớp học như:Các trình biên dịch có tránh quảng cáo tích phân trung gian hoặc chuyển đổi không?
struct mystruct
{
constexpr operator char() {return x;}
signed char x;
};
và phẫu thuật như:
mystruct m;
m.x = /* something at runtime */
int i = 3 * m + 45ULL * m;
Are trình biên dịch có thể bỏ qua việc chuyển đổi tạm thời để char
và chuyển đổi trực tiếp m
để loại yêu cầu trong biểu thức 3 * m + 45ULL * m
?
Biên dịch để lắp ráp và tìm hiểu! – user657267
Điều đó tùy thuộc vào trình biên dịch và cờ bạn đã sử dụng. Nhưng sau đó nếu bạn 'trở lại x thì sao? x * 10: 10; 'hoặc một cái gì đó phức tạp hơn. Tôi không nghĩ rằng trình biên dịch nói chung bỏ qua * trung gian * chuyển đổi sang 'char' bởi vì sau tất cả, nó có thể thực hiện rất nhiều thứ phức tạp và vì vậy giá trị cuối cùng có thể không được tính * mà không biết * giá trị trung gian, cũng bao gồm những thứ như cắt ngắn do loại nhỏ hơn. – Nawaz
Trình biên dịch thực hiện các quy tắc ngôn ngữ, tốt nhất có thể. Nếu kết quả không khớp với những gì bạn sẽ suy ra bằng cách áp dụng các quy tắc, trình biên dịch bị hỏng. –