概括
这个问题与:在 if 语句的条件部分定义变量?.
那么,为什么我不能在同一个地方检查新定义的变量的值呢?
简单的例子
换句话说,这是允许的(来自链接的问题):
if( int* x = new int( 20 ) )
{
std::cout << *x << "!\n";
delete x;
}
但这不是:
if( NULL != ( int* x = new int( 20 ) ) )
{
std::cout << *x << "!\n";
delete x;
}
第二个给我:
test.cpp:xx: error: expected primary-expression before ‘int’
test.cpp:xx: error: expected ‘)’ before ‘int’
问题
并且(也许)这里更重要的问题 - 第一个的条件是如何if
评估的?根据我的测试,这两个选项似乎都做同样的事情 - 隐式检查false
( 0
, NULL
, 不管)。但标准能保证吗?
真实世界的例子
好的,我无法根据某些自定义值检查新变量,但我可以将其与false
. 所以,这是一个真实的例子:我有一个类,包含一个template
方法:check_class
。此方法执行dynamic_cast
一个内部指针。现在我想像这样使用它:
if( some_class* some_class_ptr = cmd->check_class< some_class >() )
{
// some_class_ptr is NOT NULL here
}
else if( other_class* other_class_ptr = cmd->check_class< other_class > )
{
// other_class_ptr is NOT NULL here
}
// ...
想要这个的原因是它if
会很长,我不想在它之前声明所有变量。