你能用overol bool()评估一个构造函数对boolean的调用吗?

Mik*_*wis 4 c++

如果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)

这段代码将在我的代码库中遍布各处,因此更少的行,更高的易读性和更小的范围是重要的,并且将由此改进.

有任何想法吗?

Joh*_*itb 8

该代码包含一些语法和语义错误.我们来解决它们

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)