2010-09-15 30 views
1

我升級C++項目從2008年MSVC至2010年,而且由於新的CComBSTR移動構造函數的[的CComBSTR(的CComBSTR & &)],我正在因爲一個編譯器錯誤模棱兩可的呼叫。基本上,我們有一個String類,它非常類似於std :: wstring,它具有CComBSTR的轉換運算符。這是similator下面的代碼:移動的構造(右值引用)的隱式轉換

class CString { 
    public: 
    // ... 
    operator CComBSTR() { 
     CComBSTR temp; 
     /* Encoding conversion here */ 
     return temp; 
    } 
} 

class CObjectConfig { 
    public: 
    CString GetName() const { return m_name; } 

    private: 
    CString m_name; 
} 

現在,在代碼中的某些地方,我們做到以下幾點:

CObjectConfig config = GetObjectConfig(); 
CComBSTR objectName(config.GetName()); 

在VS2008,這將工作,因爲CString對象將被隱式轉換到CComBSTR rvalue和CComBSTR的複製構造函數(採用const CComBSTR &)將被調用來構造objectName。

然而,在VS2010中使用C++ 0x時,編譯器給出了模糊的調用錯誤,因爲CComBSTR右值似乎適合複製構造函數和移動構造函數。

雖然有點笨拙,我解決這個問題是到static_cast調用的GetName:

CComBSTR objectName(static_cast<const CComBSTR&>(config.GetName())); 
// or 
CComBSTR objectName(static_cast<CComBSTR&&>(config.GetName())); 

兩條線編譯沒有錯誤,但我需要這是否是非法的,不好的做法或不確定你的建議。謝謝。

回答

1

這看起來像一個VC2010的bug對我來說。或者,或者我錯誤地模擬了我的電腦上的情況(我沒有VC2010)。下面是我在做什麼:

#include <iostream> 

class CComBSTR 
{ 
public: 
    CComBSTR() {std::cout << "CComBSTR()\n";} 
    CComBSTR(const CComBSTR&) {std::cout << "CComBSTR(const CComBSTR&)\n";} 
    CComBSTR(CComBSTR&&) {std::cout << "CComBSTR(CComBSTR&&)\n";} 
}; 

class CString { 
    public: 
    // ... 
    operator CComBSTR() { 
     CComBSTR temp; 
     /* Encoding conversion here */ 
     return temp; 
    } 
}; 

class CObjectConfig { 
    public: 
    CString GetName() const { return m_name; } 

    private: 
    CString m_name; 
}; 

CObjectConfig GetObjectConfig() 
{ 
    return CObjectConfig(); 
} 

int main() 
{ 
    CObjectConfig config = GetObjectConfig(); 
    CComBSTR objectName(config.GetName()); 
} 

對我的G ++ - 4.4和鐺(與-std =的C++ 0x),該編譯罰款。並且它要麼打電話要麼打電話給CComBSTR(CComBSTR & &)。我對解決這個可疑的錯誤工作的建議很簡單:

CComBSTR objectName(CComBSTR(config.GetName())); 

這相當於你:

CComBSTR objectName(static_cast<CComBSTR&&>(config.GetName())); 

但不是面目可憎(和公正高效)。如果你想繼續使用static_cast,那麼將其轉換爲CComBSTR & &,因爲這可能會比常量左值更有效。

相關問題