2011-12-02 11 views
11

Considere un tipo bar que ha definida por el usuario operadores de conversión a las referencias de tipo bar:¿Bajo qué circunstancias se invocaría el operador de conversión de un tipo a sí mismo?

struct bar 
{ 
    operator bar &(); 
    operator const bar &() const; 
}; 

Cuando se aplicaría estas conversiones? Además, ¿qué implica si estos operadores fueran deleted? ¿Hay algún uso interesante de cualquiera de las características?

El siguiente programa no aparece entre aplicar la conversión:

#include <iostream> 

struct bar 
{ 
    operator bar &() 
    { 
    std::cout << "operator bar &()" << std::endl; 
    return *this; 
    } 

    operator const bar &() const 
    { 
    std::cout << "operator const bar &() const" << std::endl; 
    return *this; 
    } 
}; 

void foo(bar x) 
{ 
} 

int main() 
{ 
    bar x; 

    bar y = x;   // copy, no conversion 

    y = x;    // assignment, no conversion 

    foo(x);   // copy, no conversion 

    y = (bar&)x;  // no output 

    y = (const bar&)x; // no output 

    return 0; 
} 

Respuesta

9

C++ 11 §12.3.2

una función de conversión nunca se utiliza para convertir un objeto (posiblemente cv-calificado) para el mismo tipo de objeto (posiblemente cv-calificado) (o una referencia a IT), a un() de la clase base, posiblemente, cv-autorizado de ese tipo (o una referencia a la misma), o a (posiblemente cv-cualificada) void

+0

Parece que un compilador podría emitir una advertencia útil aquí. –

+1

Gracias. ¿Alguna idea de por qué se me permite definir tales funciones si nunca se pueden usar? –

1

no puedo ver ninguna razón por la que nunca sería llamado. Las funciones de conversión son llamadas a ... convertir. Si ya tiene el tipo correcto, no hay absolutamente ninguna razón para agregar una operación de conversión antes de la copia.

+0

Quizás: 'struct T {operator T &() const; }; T ct = T(), & r1 = ct, & r2 = T(); ' – curiousguy

2

La característica que se le permite definir una función de conversión de un tipo a sí mismo, pero que la función de conversión nunca se utiliza, puede ser una característica útil en la programación de plantillas, donde dos parámetros de tipo pueden o no referirse a la s tipo de ame, dependiendo de la instanciación. Cierto código mío se basa en esta característica. Ahorra tener que proporcionar especializaciones para casos en los que dos o más de los parámetros de tipo terminan refiriéndose al mismo tipo.

0

Solo para el registro. Logré crear este tipo de estructura en un proyecto de software más grande, confié ciegamente en la advertencia del compilador y eliminé el "método nunca usado". Bueno, supongo que encontré un escenario donde realmente se llama. El compilador parece perderse la clase base.

#include <iostream> 

struct D; 
struct B 
{ 
    virtual operator D&() 
    { 
     throw "foo"; 
    } 
}; 

struct D : public B 
{ 
    virtual operator D&() 
    { 
     std::cout << "bar" << std::endl; 
     return *this; 
    } 
}; 

int main() 
{ 
    B* b = new D(); 
    D& d = *b; 

    return 0; 
} 
Cuestiones relacionadas