W nowym standardzie, został zaproponowany nowy sposób oznaczania zwracanego typu z metod/funkcji. Przydatne linki:
Najpierw konfrontacja starego i nowego stylu:
#include <iostream>
void a1(int) {
std::cout << "call a1()" << std::endl;
}
auto a2(int) -> void {
std::cout << "call a2()" << std::endl;
}
int main() {
a1(1);
a2(2);
return 0;
}
Obie funkcje robią dokładnie to samo. Jak to zwykle bywa w C++ o mocy nowego mechanizmu można się przekonać, badając pewne szczególne przypadki tworzenia metod szablonowych. Dotychczas język nie potrafił poradzić sobie np. z detekcją typu, jaki ma powstać w wyniku dodania dwóch wartości typów pozyskanych z szablonu. W poniższym przykładzie add3(), korzysta z już nowych właściwości języka. Warto podkreślić, że
słowo kluczowe auto, jest tutaj czymś zupełnie innym, niż automatyczną detekcją typu.
#include <iostream>
template<class Lhs, class Rhs>
Ret add1(const Lhs &l, const Rhs &r)
{
return l + r; // Error, Ret musi być typu l+r
}
template<class Lhs, class Rhs>
decltype(l+r) add2(const Lhs &l, const Rhs &r)
{
return l + r; // Error, niedozwolone w C++11
}
template<class Lhs, class Rhs>
auto add3(const Lhs &l, const Rhs &r) -> decltype(l+r)
{
return l + r;
}
int main()
{
std::cout << add3(3.14, 700L) << std::endl;
return 0;
}
Wynik:
703.14
Brak komentarzy:
Prześlij komentarz