Nie jesteś zalogowany na forum.

#1 2015-08-27 21:17:58

pj1031999
Użytkownik
Data rejestracji: 2015-08-26
Liczba postów: 5

[SOLVED] C++ return auto

Cześć,
mam sobie taki kod:

#include <iostream>

auto foo(auto a, auto b) {
  auto res = a + b;
  std::cout << res << "\n";
  return res;
}

template <typename A, typename B> 
auto foo2(A a, B b) { 
  return a + b; 
}

int main(void) {
  std::cout << foo(3, 3.14) << "\n";
  std::cout << foo(3.14, 3) << "\n";
  std::cout << foo2(3, 3.14) << "\n";
  std::cout << std::flush;
  return 0;
}

Czy mógłby mi ktoś wytłumaczyć jak auto wykrywa co ma zwrócić w foo? ponieważ pierwsze wywołanie zwraca inta, a pozostałe double.
Wynik sprawdzałem zarówno u siebie, jak i na ideone.
Flagi kompilacji u mnie:

/usr/bin/g++ -O2 -pipe -Wall -Wshadow -Wextra -Wunused -fdiagnostics-color -std=gnu++1z    sth.cc   -o sth

Ostatnio edytowany przez pj1031999 (2015-08-27 23:48:34)

Offline

#2 2015-08-27 23:10:09

moocknoock
Użytkownik
Data rejestracji: 2015-08-27
Liczba postów: 1

Odp: [SOLVED] C++ return auto

Kiedy dodasz flagę: -pedantic do gcc zobaczysz:

warning: ISO C++ forbids use of ‘auto’ in parameter declaration [-Wpedantic]
auto foo(auto a, auto b){

Kiedy spróbujesz skompilować to clangiem zobaczysz:

error: 'auto' not allowed in function prototype
auto foo(auto a, auto b){

W C++14 nie można mieć auto w definicji funkcji. Podałeś dla gcc -std=gnu++1z (czyli przymiarka do c++17) ale auto w argumentach nie jest jeszcze zatwierdzone więc to że się w ogóle kompiluje to tylko samowolka ludzi od gcc.

Jeżeli chcesz mieć auto jako typ argumentu, możesz przerobić funkcje na lambdę i wtedy zwróci double.

#include <iostream>

auto foo(auto a, auto b){
  auto res = a + b;
  std::cout << res << "\n";
  return res;
}


auto foolmbd = [](auto z, auto x){return z+x;};

template <typename A, typename B> 
auto foo2(A a, B b) { 
  return a + b; 
}

int main(void) {
  std::cout << foolmbd(3,3.14) << "\n";
  std::cout << foo(3.14, 3) << "\n";
  std::cout << foo2(3, 3.14) << "\n";
  std::cout << std::flush;
  return 0;
}

Offline

#3 2015-08-27 23:44:58

pj1031999
Użytkownik
Data rejestracji: 2015-08-26
Liczba postów: 5

Odp: [SOLVED] C++ return auto

Dzięki za szybką i wyczerpującą odpowiedź.
Temat do zamknięcia.

Offline

Stopka

Napędzają nas PacmanVPS i MegiTeam

Forum oparte na FluxBB