¿Copiar elision: mover el constructor al que no se llama cuando se usa una expresión ternaria en la declaración de retorno?

Considere el siguiente ejemplo:

#include <cstdio>

class object
{
public:
    object()
    {
        printf("constructor\n");
    }

    object(const object &)
    {
        printf("copy constructor\n");
    }

    object(object &&)
    {
        printf("move constructor\n");
    }
};

static object create_object()
{
    object a;
    object b;

    volatile int i = 1;

// With #if 0, object's copy constructor is called; otherwise, its move constructor.
#if 0
    if (i)
        return b; // moves because of the copy elision rules
    else
        return a; // moves because of the copy elision rules
#else
    // Seems equivalent to the above, but behaves differently.
    return i ? b : a; // copies (with g++ 4.7)
#endif
}

int main()
{
    auto data(create_object());

    return 0;
}

Y considere este bit del borrador de trabajo de C ++ 11, n3337.pdf, 12.8 [class.copy], punto 32:

Cuando se cumplen o se cumplirían los criterios para la elección de una operación de copia, salvo por el hecho de que el objeto fuente es un parámetro de función,y el objeto a copiar se designa con un lvalor, la resolución de sobrecarga para seleccionar el constructor para la copia se realiza primero como si el objeto se designara con un valor de r. Si la resolución de sobrecarga falla, o si el tipo del primer parámetro del constructor seleccionado no es una referencia de valor al tipo del objeto (posiblemente cv-calificado), la resolución de sobrecarga se realiza nuevamente, considerando el objeto como un valor de l. [Nota: esta resolución de sobrecarga de dos etapas se debe realizar independientemente de si se producirá elision de copia. Determina el constructor que se llamará si no se realiza el elision, y el constructor seleccionado debe ser accesible incluso si la llamada es eluida. "Nota final"

Así, si utilizamos#if 1 en el ejemplo, el constructor de movimiento se prueba primero cuando se devuelve el objeto y luego el constructor de copia. Como tenemos un constructor de movimiento, se usa en lugar del constructor de copia.

En el últimoreturn declaración encreate_object() sin embargo, hemos observado que el constructor de movimiento no se utiliza. ¿Es o no es esto una violación de las reglas del idioma? ¿El lenguaje requiere que el constructor de movimiento se use en el últimoreturn ¿declaración?

Respuestas a la pregunta(1)

Su respuesta a la pregunta