Xét đoạn mã sau:Tại sao constexpr hoạt động với các mẫu?
template<typename T>
constexpr inline T fma(T a, T b, T c)
{
return a * b + c;
}
này biên dịch tốt. Nhưng tại sao nó? Về lý thuyết, các hàm constexpr chỉ có thể gọi các hàm constexpr khác. Tuy nhiên, không có gì đảm bảo rằng các toán tử sẽ là các hàm constexpr. Ví dụ, giả sử tôi có một số loại với giao diện như sau:
Các nhà khai thác + và * là không constexpr. Nếu tôi viết mã sau:
fma(someType(), someType(), someType());
Không nên biên dịch vì hàm constexpr đang gọi hàm không cố định. Nhưng nó chỉ tốt thôi. Tại sao điều này?
Tôi đang sử dụng trình biên dịch G ++ của MinGW với tùy chọn -std = C++ 0x.
Để có ví dụ rõ ràng nó không thể tối ưu hóa mọi thứ, nó biên dịch với GCC 4.7.1 khi ba đối số được nhập vào và kết quả được in: http://ideone.com/aBRPU – chris
hãy thử cách này: 'constexpr someType dummy = fma (someType(), someType(), someType());';) – mfontanini
Ooh, tôi chỉ tìm thấy trong tiêu chuẩn rằng các hàm 'constexpr' là ngầm, nếu điều đó giúp bạn tiết kiệm không gian. – chris