2011-12-02 35 views
11

考慮一個類型bar已用戶定義的轉換運算符至bar類型的引用:在什麼情況下會調用類型的轉換操作符?

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

當將應用於這些轉換?此外,如果這些運營商是deleted,這意味着什麼?有沒有任何功能有趣的使用?

下面的程序似乎並不適用任何轉換:

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

回答

9

C++ 11§12.3.2

A轉換函數從不用於轉換(可能CV-合格)對象(可能CV修飾)相同的對象類型(或參考它),以(可能CV修飾)基類型(或對它的引用)的,或(可能CV修飾)空隙

+0

那看起來編譯器會在這裏發出一個有用的警告。 –

+1

謝謝。任何想法,爲什麼我被允許定義這樣的功能,如果他們永遠不能使用? –

1

我看不出有任何理由爲什麼它會永遠被調用。轉換函數被調用來轉換。如果您已經擁有正確的類型,則在複製之前完全沒有理由添加轉換操作。

+0

也許:struct T {operator T&()const; }; T ct = T(),&r1 = ct,&r2 = T();' – curiousguy

2

您被允許定義一個轉換函數的特徵從類型到它本身,但轉換函數從不使用,可以成爲模板編程中的一個有用功能,其中兩個類型參數可能指向或不指向s ame類型,取決於實例。我的一些代碼依賴於此功能。它節省了必須爲兩個或更多的類型參數最終引用相同類型的情況提供專門化。

0

只是爲了記錄。我設法在一個更大的軟件項目中創建這種結構,盲目地信任編譯器警告並刪除了「未使用的方法」。那麼,我想我找到了一個實際被調用的場景。編譯器似乎錯過了基類。

#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; 
} 
相關問題