Добавлено: 09 дек 2004, 13:05
В том то и дело, что только в случае ссылки время жизни объекта увеличивается до пределов текущего блока. Во всех остальных случаях возвращаемый объект живёт только до завершения операции присваивания.
форум программистов
https://www.developing.ru/
Код: Выделить всё
_bstr_t GetSomeBSTRString();
...
void SomeFunction()
{
...
//char * strMyConvertedString = GetSomeBSTRString();
//cout << strMyConvertedString; // access violation exception
_bstr_t &strMyConvertedString = GetSomeBSTRString();
cout << strMyConvertedString.operator char*();
...
}
У него же (у _bstr_t) есть оператор для неявного преобразования к char* ?Дык, не умеет ostream с _bstr_t работать и vice versa
Код: Выделить всё
bw_bitmap(100,100) = true;
if (bw_bitmap(100,100)) {
...
}
Не выдаст. См. код _bstr_t. Выделенная под конвертацию строка удаляется лишь в деструкторе внутреннего класса, когда количество ссылок на контейнер BSTR строки не станет нулевым.Да, ты прав. Но в случае _bstr_t твой пример выдаст ошибку даже если бы объект-результат жил до конца блока.
Нет, компилятор не глупый. Он просто не знает какой оператор вызвать для того, чтобы вывести эту сроку. cout умеет выводить как обычные строки, так и BSTR строки, точно также, как и _bstr_t может интерпритироваться двояко, благодаря перегруженным в ней операторам приведения. Речь идёт не о глупости компилятора, а о том, что ситуация "ambigous" - неоднозначная. Если бы не это одно НО, то явного преобразования писать бы не пришлось. Естественно в данном надуманном случае лучше вообще использоватьА компилятор глупый, об этом не знает. Без явного приведения никак (см. последнее сообщение HKarel)
Код: Выделить всё
cout << (BSTR)GetSomeBSTRString();