检查构造函数是否为NULL?

Joe*_*Fan 1 c++

我跑过这个C++代码:

if (Foo f = "something")
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

究竟是什么if条款检查?构造函数可以计算为NULL吗?

编辑:

Foo是一个班级

R S*_*ahu 7

什么是if子句检查?构造函数可以计算为NULL吗?

该行相当于:

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

   // Use if
   if ( f )
   {
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

如果有用户定义的函数将a转换Foo为a ,那将会有效bool.否则,它将无法正常工作.与NULL没有直接关系.但是,如果有用户定义的转换为任何类型的指针,那么

if ( f ) { ... }
Run Code Online (Sandbox Code Playgroud)

是相同的

if ( f != NULL ) { ... }
Run Code Online (Sandbox Code Playgroud)

如果你使用C++ 11,那也是一样的

if ( f != nullptr ) { ... }
Run Code Online (Sandbox Code Playgroud)

示例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";
   }
}
Run Code Online (Sandbox Code Playgroud)

示例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";
   }
}
Run Code Online (Sandbox Code Playgroud)

示例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";
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 它还要求`Foo`有一个复制/移动赋值运算符,它接受一个`const char*`或convertible类型 (3认同)
  • 我认为用这个奇怪的情况编译一个[mcve]是个好主意. (2认同)