Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么编译器使用临时变量?_C++_Visual Studio 2010_Atl_Ternary Operator_Bstr - Fatal编程技术网

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;

不再有临时的了。

请尝试我的代码,调试并进入调用:有临时的,即使您没有“看到”它:-)