我正在将 C++ 项目从 MSVC 2008 升级到 2010,并且由于新的 CComBSTR 移动构造函数 [CComBSTR( CComBSTR&& )],由于调用不明确,我收到编译器错误。
本质上,我们有一个 String 类,它与具有 CComBSTR 的强制转换运算符的 std::wstring 非常相似。这类似于以下代码:
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 右值,并且将调用 CComBSTR 的复制构造函数(采用 const CComBSTR&)来构造 objectName。
然而,在带有 C++0x 的 VS2010 中,编译器给出了一个模棱两可的调用错误,因为 CComBSTR 右值似乎同时适合复制构造函数和移动构造函数。
虽然有点笨拙,但我对这个问题的解决方案是 static_cast 对 GetName 的调用:
CComBSTR objectName( static_cast<const CComBSTR&>( config.GetName() ) );
// or
CComBSTR objectName( static_cast<CComBSTR&&>( config.GetName() ) );
这两行编译都没有错误,但我需要您就这是否非法、不好的做法或未定义提出建议。谢谢你。