C++ 为什么编译器使用临时变量?
再现问题的最小代码:C++ 为什么编译器使用临时变量?,c++,visual-studio-2010,atl,ternary-operator,bstr,C++,Visual Studio 2010,Atl,Ternary Operator,Bstr,再现问题的最小代码: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { CComBSTR ccbTest( L"foo" ); const wchar_t * pTest = ccbTest ? ccbTest : L"null string"; return 0; } 当编译器想要在pTest中存储指针时,它会使用一个临时的CComBSTR。然后,它使用CCcomBSTR类中可用的BSTR转换,
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
CComBSTR ccbTest( L"foo" );
const wchar_t * pTest = ccbTest ? ccbTest : L"null string";
return 0;
}
当编译器想要在pTest
中存储指针时,它会使用一个临时的CComBSTR
。然后,它使用CCcomBSTR
类中可用的BSTR
转换,并将指针存储在pTest
中。然后临时文件被销毁,剩下的是pTest
中一个悬空的指针
修复方法是强制转换CComBSTR
:
const wchar_t * pTest = ccbTest ? static_cast<BSTR>( ccbTest ) : L"null string";
const wchar\u t*pTest=ccbTest?静态_cast(ccbTest):L“空字符串”;
我不明白为什么需要修理。我以为编译器会自己尝试转换成
BSTR
。为什么是临时的?在上面的示例中,我没有看到临时的CComBSTR
CComBSTR是一个RAII包装类,用于帮助管理BSTR的生存期,当它超出范围时,底层BSTR将被销毁
ccbTest是一个自动(堆栈)变量,当它超出范围(在_tmain的末尾)时,它和它管理的BSTR将被销毁。临时存在的原因与此相同 如以下所述: 三元?:表达式的类型是其第二个表达式的常见类型 第三个论点。如果两种类型相同,则会得到一个引用 返回如果它们可以相互转换,则选择一个 其他对象被转换[…]。既然你不能回来了 对临时(已转换/升级)的左值引用 变量),其类型为值类型 由于您的
L“null string”
是与CComBSTR
不同类型的临时值,因此三元值的整个结果都是值类型,这意味着结果是以临时值形式复制的
如果您尝试:
CComBSTR ccbTest( L"foo" );
CComBSTR ccbNull( L"ull string" );
const wchar_t * pTest = ccbTest ? ccbTest : ccbNull;
不再有临时的了。请尝试我的代码,调试并进入调用:有临时的,即使您没有“看到”它:-)