2014-11-26 26 views
5

Minimal kod odtworzenia problemu:Dlaczego kompilator używa zmiennej tymczasowej?

#include "stdafx.h" 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    CComBSTR ccbTest(L"foo"); 
    const wchar_t * pTest = ccbTest ? ccbTest : L"null string"; 

    return 0; 
} 

Kompilator korzysta z tymczasowej CComBSTR gdy chce zapisać wskaźnik w pTest. Następnie używa konwersji BSTR dostępnej w klasie CCcomBSTR, z tymczasowym, i przechowuje wskaźnik w pTest. Następnie tymczasowy jest zniszczony, a ja pozostaję z wiszącym wskaźnikiem w pTest.

Rozwiązaniem jest do oddania CComBSTR:

const wchar_t * pTest = ccbTest ? static_cast<BSTR>(ccbTest) : L"null string"; 

Nie rozumiem dlaczego poprawka jest konieczna. Pomyślałem, że kompilator po prostu spróbuje sam przekonwertować na BSTR. Dlaczego tymczasowy?

Odpowiedz

2

Tymczasowy istnieje z tych samych powodów this question ma.

I jak podano w one of its answer:

Rodzaj trójskładnikowego: wyrażenia jest powszechnym typem drugim i trzeciego argumentu. Jeśli oba typy są takie same, otrzymasz referencję od . Jeśli można je konwertować do siebie, jeden zostanie wybrany, a inny zostanie przekonwertowany [...]. Ponieważ nie można zwrócić wartości l-wartości do zmiennej tymczasowej (przekształconej/promowanej ), jej typ jest typem wartości.

Od swojej L"null string" jest tymczasowy innego rodzaju niż CComBSTR cały wynikiem trójskładnikowego jest typ wartości, co oznacza wynik jest kopiowany w tymczasowym.

Jeśli spróbujesz:

CComBSTR ccbTest(L"foo"); 
CComBSTR ccbNull(L"ull string"); 

const wchar_t * pTest = ccbTest ? ccbTest : ccbNull; 

Nie ma bardziej charakter tymczasowy.

0

Nie widzę tymczasowego CComBSTR w powyższym przykładzie.

CComBSTR jest klasą opakowania RAII używaną do zarządzania czasem życia BSTR, a gdy wychodzi poza zakres, bazowy BSTR zostanie zniszczony.

ccbTest jest zmienną automatyczną (stos), a gdy wykracza poza zakres (na końcu _tmain) to i BSTR, którym zarządza, zostaną zniszczone.

+0

Proszę wypróbować mój kod, debugować i nawiązać połączenia: jest tymczasowy, nawet jeśli go nie "widzisz" :-) – manuell