¿La deducción de tipo de retorno automático fuerza a varias funciones a tener el mismo tipo de retorno?


Considere el siguiente fragmento:

struct A
{
  auto foo(), bar();
};

auto A::foo() { return 1; }
auto A::bar() { return 'a'; }

int main()
{

}

Compila fine en Clang++ 3.7.0.

Falla en G++ 5.2.0:

main.cpp: In member function 'auto A::bar()':
main.cpp:7:24: error: inconsistent deduction for 'auto': 'int' and then 'char'
auto A::bar() { return 'a'; }

¿La deducción de tipo de retorno automático fuerza a múltiples funciones, declaradas en una sola instrucción, a tener el mismo tipo de retorno?

Author: Marc Andreson, 2015-10-29

2 answers

Basado en lo siguiente, GCC tiene el comportamiento correcto en este caso, pero solo por coincidencia (ver abajo):

§7.1.6.4 [dcl.spec.auto]/8

Si la lista de declaradores de inicio contiene más de un declarador de inicio, todos formarán declaraciones de variables.

¿Por qué solo por coincidencia? El mensaje de error es una pista. Cambiar las funciones para deducir el mismo tipo de retorno hace que GCC compile el código. Si bien es correcto al dar un error aquí, aunque engañosa, solo lo hace cuando el tipo deducido es inconsistente. Siempre debe dar un error.

 25
Author: chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-30 20:08:04

Sí.

auto no significa "cualquier tipo", significa un tipo específico que el compilador debe deducir.

Esto no es específico de las declaraciones de funciones, auto i = 1, f = 4.7; tampoco funciona.

Además, declarar múltiples funciones en una sola instrucción no parece una buena idea de todos modos.

 25
Author: Bo Persson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-29 12:34:39