Caso 1)
m
se interpreta como un retorno de la función my
y sin argumentos. para ver el resultado esperado eliminar ()
es decir utilizan my m;
Caso 2)
Esto es algo más conocido como el "análisis sintáctico más acuciantes".
n
se interpreta como una función que devuelve my
que toma un argumento de tipo puntero a la función que devuelve my
sin tomar argumentos.
Para ver la salida esperada en este caso tratar my n((my()));
[En lugar de tratar como una especificación de argumento como en el primer caso, el compilador ahora interpretarlo como una expresión debido a la extra de ()
]
Mi interpretación:
my n((my()))
es equivalente a my n = my()
. Ahora la expresión rvalue my()
crea un temporal [es decir, una llamada al constructor por defecto] y n
se copia inicializado a ese objeto temporal [ninguna llamada a la copia-ctor debido a algún compiler optimization]
PS: No soy 100% seguro de la última parte de mi respuesta. Corrígeme si estoy equivocado.
No se llama RVO, pero de hecho es una optimización común. – MSalters
@MSalters: Sí, creo que esta es una variante de RVO. :) –