该代码包含一些语法和语义错误。让我们修复它们
class A
{
public:
A() {};
operator bool() { return true; }
};
int main()
{
if (A a = A())
{
// do stuff
}
}
您可以选择将转换函数中的类型更改为其他类型。正如所写,布尔转换也将成功转换为任何整数类型。转换为void*
将限制转换为仅 bool 和void*
,这是一个常用的习语。另一种更好的方法是转换为某种私有类型,称为安全布尔习语 http://www.artima.com/cppsource/safebool.html.
class A
{
private:
struct safe_bool { int true_; };
typedef int safe_bool::*safe_type;
public:
A() {};
operator safe_type() { return &safe_bool::true_; }
};
回到语法:如果您有 else 部分,您可以使用声明的变量的名称,因为它仍在范围内。所有分支处理成功后销毁
if(A a = A())
{ ... }
else if(B b = a)
{ ... }
您也可以使用与以前相同的名称,并且该变量将隐藏其他变量,但您不能在任何分支的最外层块中声明相同的名称 - 它会与其他声明发生冲突而不是隐藏。
if(int test = 0)
{ ... }
else
{ int test = 1; /* error! */ }
声明和初始化变量的技术最常与dynamic_cast
虽然如此,但也可以与上面的用户定义类型完美地一起使用
if(Derived *derived = dynamic_cast<Derived*>(base)) {
// do stuff
}
请注意,从语法上讲,您必须初始化变量(使用= expression
形式类似于默认参数)。以下内容无效
if(ifstream ifs("file.txt")) {
// invalid. Syntactic error
}