C ++ 11'de, işlev bildirimi için iki sözdizimi vardır:
dönüş tipi tanımlayıcı ( argüman beyanları ... )
ve
auto tanımlayıcı ( bağımsız değişken-bildirimler ... ) -> dönüş_türü
Bunlar eşdeğerdir. Şimdi eşdeğer olduklarında, neden ikincisini kullanmak istiyorsunuz? C ++ 11 decltype, bir ifadenin türünü tanımlamanıza izin veren bu harika şeyi tanıttı . Dolayısıyla, dönüş türünü bağımsız değişken türlerinden türetmek isteyebilirsiniz. Yani dene:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
ve derleyici bu ne bilmiyor söyleyecektir ave biçindedir decltypeargüman. Bunun nedeni, yalnızca argüman listesi tarafından bildirilmeleridir.
Daha declvalönce bildirilmiş olan şablon parametrelerini kullanarak sorunu kolayca çözebilirsiniz . Sevmek:
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);
şu anda gerçekten ayrıntılı hale gelmesi dışında. Böylece alternatif bildirim sözdizimi önerildi ve uygulandı ve şimdi yazabilirsiniz
template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);
ve daha az ayrıntılı ve kapsam kurallarının değişmesi gerekmiyordu.
C ++ 14 güncellemesi: C ++ 14 ayrıca yalnızca
auto tanımlayıcı ( argüman beyanları ... )
işlev kullanımdan önce tam olarak tanımlandığı ve tüm returnifadeler aynı tipte olduğu sürece . ->Eğer kaynak dosyada vücudu gizlemek istiyorsanız sözdizimi (başlığında bildirilmiş) Kamu fonksiyonlar için faydalıdır kalır. Açıkça bu, şablonlarla yapılamaz, ancak başka türlü yazılması zor olan bazı somut türler (genellikle şablon meta programlaması yoluyla türetilir) vardır.