2014-11-26 23 views
5

đang Minimal tái tạo vấn đề:Tại sao trình biên dịch sử dụng biến tạm thời?

#include "stdafx.h" 


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

    return 0; 
} 

Trình biên dịch sử dụng tạm thời CComBSTR khi nó muốn để lưu trữ một con trỏ trong pTest. Sau đó, nó sử dụng chuyển đổi BSTR có sẵn trong lớp CCcomBSTR, với tạm thời và lưu con trỏ trong pTest. Sau đó, tạm thời bị phá hủy, và tôi còn lại với một con trỏ lơ lửng trong pTest.

Việc sửa chữa là để đúc các CComBSTR:

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

Tôi không hiểu lý do tại sao việc sửa chữa là cần thiết. Tôi nghĩ rằng trình biên dịch sẽ chỉ cố gắng tự chuyển đổi thành BSTR. Tại sao tạm thời?

Trả lời

2

Tạm thời tồn tại với cùng một lý do this question.

Và như đã nêu trong one of its answer:

Các loại ternary: biểu hiện là loại phổ biến của các đối số và thứ ba lần thứ hai. Nếu cả hai loại đều giống nhau, bạn sẽ có được tham chiếu quay lại. Nếu chúng được chuyển đổi cho nhau, một được chọn và khác được chuyển đổi [...]. Vì bạn không thể trả lại tham chiếu giá trị bằng một biến tạm thời (biến được chuyển đổi/được thăng cấp ), loại của nó là một loại giá trị.

Kể từ L"null string" của bạn là một tạm thời của một loại khác với CComBSTR toàn bộ kết quả của các ternary là một loại giá trị có nghĩa là kết quả được sao chép trong một tạm thời.

Nếu bạn cố gắng:

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

const wchar_t * pTest = ccbTest ? ccbTest : ccbNull; 

Có không chỉ là tạm thời.

0

Tôi không thấy CComBSTR tạm thời trong ví dụ trên của bạn.

CComBSTR là lớp trình bao bọc RAII được sử dụng để giúp quản lý tuổi thọ của BSTR và khi nó nằm ngoài phạm vi BSTR cơ bản sẽ bị hủy.

ccbTest là biến tự động (stack) và khi nó nằm ngoài phạm vi (vào cuối _tmain) và BSTR quản lý sẽ bị hủy.

+0

Hãy thử mã của tôi, gỡ lỗi và bước vào các cuộc gọi: có một tạm thời, ngay cả khi bạn không "nhìn thấy" nó :-) – manuell

Các vấn đề liên quan