Я обновляю проект C++ с MSVC 2008 до 2010, и из-за нового конструктора перемещения CComBSTR [CComBSTR( CComBSTR&& )] я получаю ошибку компилятора из-за неоднозначного вызова.
По сути, у нас есть класс String, очень похожий на std::wstring, который имеет оператор приведения к CComBSTR. Это похоже на следующий код:
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 будет неявно преобразован в rvalue CComBSTR, а конструктор копирования CComBSTR (взяв константу CComBSTR&) будет вызываться для создания objectName.
Однако в VS2010 с C++0x компилятор выдает неоднозначную ошибку вызова, поскольку rvalue CComBSTR, кажется, подходит как для конструктора копирования, так и для конструктора перемещения.
Хотя это немного неуклюже, мое решение этой проблемы состоит в том, чтобы static_cast вызвать GetName:
CComBSTR objectName( static_cast<const CComBSTR&>( config.GetName() ) );
// or
CComBSTR objectName( static_cast<CComBSTR&&>( config.GetName() ) );
Обе строки компилируются без ошибок, но мне нужен ваш совет, является ли это незаконным, плохой практикой или неопределенным. Спасибо.