考慮下面的代碼:爲什麼constexpr使用模板?
template<typename T>
constexpr inline T fma(T a, T b, T c)
{
return a * b + c;
}
這編譯就好了。但爲什麼呢?理論上,constexpr函數只能調用其他constexpr函數。但是,不能保證運營商將具有協同功能。舉例來說,假設我有一些類型有以下接口:
運算符+和* 不 constexpr。如果我寫了下面的代碼:
fma(someType(), someType(), someType());
應該編譯失敗,因爲constexpr函數是調用非constexpr功能。但它編譯得很好。爲什麼是這樣?
我正在使用MinGW的G ++編譯器和-std = C++ 0x選項。
對於一個很明顯的例子,它不能優化所有的東西,當輸入三個參數時,它會用GCC 4.7.1進行編譯,並顯示結果:http://ideone.com/aBRPU – chris
試試這個: 'constexpr someType dummy = fma(someType(),someType(),someType());';) – mfontanini
哦,我剛剛在標準中發現'constexpr'函數是隱式內聯的,如果這樣可以節省空間。 – chris