C++ 复古新手 : address references

标签 c++ pointers null

<分区>

所以,在离开 C++ 20 年后,我又回到了它。我一辈子都无法解决这个问题。如果我传递地址引用而不是指针引用,我正在使用 [at work] 类。下面这个小 foo() 示例,为什么我不能返回 NULL 或 nullptr?我忘记了违反了什么规则?

int& foo(int &i)
{
  if (i > 10)
  {
    // or return nullptr;
    return NULL;
  }
  return i;
}

最佳答案

why cannot I not return NULL or nullptr?

因为您已经声明了将引用 返回给int 的函数。引用必须始终“指向”存在的实际 intnullptr 因此不是有效值。 (空指针不能转换为对 int 的引用,它只能转换为指向 int 的指针。)

解决方案一:

声明函数以返回一个指向 int 的指针:

int* foo(int &i)
{
  if (i > 10)
  {
    return nullptr; // or NULL, or 0. (Since NULL is a macro expanding to `0` or `nullptr` anyway.)
  }
  return &i; // Return the address of i, aka a pointer to i.
}

解决方案 2:

声明一个在语义上等同于返回空值的 int 值。

int& foo(int &i)
{
  static int nullValue = 0;
  if (i > 10)
  {
    // or return nullptr;
    return nullValue;
  }
  return i;
}

现在每次 i > 10 为真时,该函数将返回对等于 0 的静态局部变量的引用(您可以更改实际值,如果需要)。

当然,如果return i返回一个与nullValue相同的值,那么函数调用者无法知道函数是否返回了对的引用nullValue 或一些实际值 i

关于C++ 复古新手 : address references,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28659628/

相关文章:

python - 这是所有编程语言的普遍错误吗

C - "char var[]"和 "char *var"之间的区别?

c++ - 如何安全地将 new 创建的对象传递给构造函数

c++ - 动态分配的 C 字符串数组

javascript - 数组在列表的开头添加 'undefined' - 抛出计数器和列表显示

java - JTextField.getText() 返回 null 值,即使它里面有内容

c++ - 设计算法的通用选项

c++ - 将基类函数标记为 virtual 和 final 有什么意义吗?

c++ - fork 进程和客户端之间断开连接

objective-c - 在检查空 NSString 对象时是否为 nil 和 (NSString *)[NSNull null]