检查构造函数是否为NULL?

时间:2017-06-15 22:25:14

标签: c++

我遇到了这个C ++代码:

if (Foo f = "something")
{
    ...
}

究竟检查if子句是什么?构造函数可以评估为NULL吗?

修改

Foo是一个班级

1 个答案:

答案 0 :(得分:7)

  

究竟是什么if子句检查?构造函数可以评估为NULL吗?

该行相当于:

// Create a new scope
{
   // Create the object in the new scope
   Foo f = "something";

   // Use if
   if ( f )
   {
      ...
   }
}

如果存在将Foo转换为bool的用户定义函数,那将会有效。否则,它就不会起作用。与NULL没有直接关系。但是,如果有用户定义的转换为任何类型的指针,那么

if ( f ) { ... }

相同
if ( f != NULL ) { ... }

如果使用C ++ 11,那也与

相同
if ( f != nullptr ) { ... }

示例1(这不起作用):

struct Foo
{
   Foo(char const*) {}
};

int main()
{
   Foo f = "something";

   // Does not work.
   // There is nothing to convert a Foo to a bool
   if ( f )
   {
      std::cout << "true\n";
   }
}

示例2(这确实有效):

struct Foo
{
   Foo(char const*) {}

   // A direct conversion function to bool
   operator bool () { return true; }
};

int main()
{
   Foo f = "something";
   if ( f )
   {
      std::cout << "true\n";
   }
}

示例3(这确实有效):

struct Foo
{
   Foo(char const*) {}

   // A direct conversion function to void*
   operator void* () { return this; }
};

int main()
{
   Foo f = "something";

   if ( f )
   {
      std::cout << "true\n";
   }

   // Same as above
   if ( f != NULL )
   {
      std::cout << "true\n";
   }

   // Same as above
   if ( f != nullptr )
   {
      std::cout << "true\n";
   }
}