2011-12-02 10 views
11

Rozważmy typ bar który zdefiniowany przez użytkownika operatory konwersji do referencji typu bar:W jakich okolicznościach zostanie wywołany operator konwersji typu?

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

Kiedy te konwersje być stosowane? Co ponadto oznacza, że ​​operatorzy ci byli deleted? Czy jest jakieś interesujące zastosowanie którejś z tych funkcji?

Poniższy program nie wydaje się mieć zastosowanie zarówno konwersję:

#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; 
} 

Odpowiedz

9

C++ 11 §12.3.2

funkcję konwersji nie jest wykorzystywany do konwersji (ewentualnie CV zastrzeżeniami) przedmiotu do tego typu obiektu (ewentualnie CV zastrzeżeniami) (lub odniesienie do it), do (prawdopodobnie kwalifikowanej z cv) klasy bazowej tego typu (lub odniesienie do niej) lub do (prawdopodobnie kwalifikowana do cv) void

+0

Wygląda na to, że kompilator mógłby wtedy wysłać użyteczne ostrzeżenie. –

+1

Dzięki. Każdy pomysł, dlaczego mogę zdefiniować takie funkcje, jeśli nigdy nie można ich użyć? –

1

Nie widzę żadnego powodu, dlaczego byłoby kiedykolwiek nazwie. Funkcje konwersji są wywoływane, aby ... konwertować. Jeśli już masz odpowiedni typ, nie ma absolutnie żadnego powodu, aby dodać operację konwersji przed kopiowaniem.

+0

Być może: 'struct T {operator T &() const; }; T ct = T(), i r1 = ct, & r2 = T(); ' – curiousguy

2

Funkcja, którą można zdefiniować funkcję konwersji od typu do siebie, ale funkcja konwersji nigdy nie jest używana, może być użyteczną funkcją w programowaniu szablonów, gdzie dwa parametry typu mogą lub nie mogą odnosić się do s ame type, w zależności od instancji. Niektóre kody opierają się na tej funkcji. Oszczędza to konieczności zapewnienia specjalizacji w przypadkach, w których dwa lub więcej parametrów typu kończy się odnosząc się do tego samego typu.

0

Tylko dla zapisu. Udało mi się stworzyć ten rodzaj struktury w większym projekcie oprogramowania, ślepo zaufałem ostrzeżeniu kompilatora i usunąłem "nigdy nieużywaną metodę". Cóż, domyślam się, że znalazłem scenariusz, w którym jest tak naprawdę nazywany. Wydaje się, że kompilator tęskni za klasą bazową.

#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; 
} 
Powiązane problemy