如果bool()运算符被重载,可以将构造函数调用求值为布尔值吗?
class A
{
public:
A() {};
operator bool() const { return true; }
}
main()
{
if (A a = A())
{
// do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
以上代码是否有效,或者我是否需要实现main:
int main(int argc, const char* argv[])
{
A a();
if (a)
{
// do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码将在我的代码库中遍布各处,因此更少的行,更高的易读性和更小的范围是重要的,并且将由此改进.
有任何想法吗?
该代码包含一些语法和语义错误.我们来解决它们
class A
{
public:
A() {};
operator bool() { return true; }
};
int main()
{
if (A a = A())
{
// do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
您可以选择将转换函数中的类型更改为其他类型.如上所述,布尔转换也将成功转换为任何整数类型.转换为void*将限制转换为bool void*,这是一种常用的习语.另一个更好的方法是转换为一些私人类型,称为安全bool习语.
class A
{
private:
struct safe_bool { int true_; };
typedef int safe_bool::*safe_type;
public:
A() {};
operator safe_type() { return &safe_bool::true_; }
};
Run Code Online (Sandbox Code Playgroud)
回到语法:如果你有一个else部分,你可以使用声明的变量的名称,因为它仍在范围内.在成功处理所有分支后,它被销毁
if(A a = A())
{ ... }
else if(B b = a)
{ ... }
Run Code Online (Sandbox Code Playgroud)
您也可以使用与之前相同的名称,并且变量将隐藏其他变量,但您可能不会在任何分支的最外部块中声明相同的名称 - 它将与另一个声明冲突而不是隐藏.
if(int test = 0)
{ ... }
else
{ int test = 1; /* error! */ }
Run Code Online (Sandbox Code Playgroud)
声明和初始化变量的技术通常与...一起使用dynamic_cast,但也可以与上面的用户定义类型一起使用.
if(Derived *derived = dynamic_cast<Derived*>(base)) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
请注意,从语法上讲,您必须初始化变量(使用= expression类似于默认参数的形式).以下内容无效
if(ifstream ifs("file.txt")) {
// invalid. Syntactic error
}
Run Code Online (Sandbox Code Playgroud)