我升級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()));
兩條線編譯沒有錯誤,但我需要這是否是非法的,不好的做法或不確定你的建議。謝謝。