C++;复古新手:地址参考 所以,在C++ 20年后,我又回到了C++中。我一生都不能对这个问题耿耿于怀。如果我传递地址引用,而不是指针引用,我将使用[at work]类。下面这个小foo()示例,为什么我不能返回NULL或NULL ptr?我违反了什么规则而忘记了 int& foo(int &i) { if (i > 10) { // or return nullptr; return NULL; } return i; } 在C++中,p>空是定义的实现,但通常只是整数: #define NULL 0

C++;复古新手:地址参考 所以,在C++ 20年后,我又回到了C++中。我一生都不能对这个问题耿耿于怀。如果我传递地址引用,而不是指针引用,我将使用[at work]类。下面这个小foo()示例,为什么我不能返回NULL或NULL ptr?我违反了什么规则而忘记了 int& foo(int &i) { if (i > 10) { // or return nullptr; return NULL; } return i; } 在C++中,p>空是定义的实现,但通常只是整数: #define NULL 0,c++,pointers,null,C++,Pointers,Null,或 #定义NULL nullptr//自C++11以来 在这两种情况下,错误都是类型不匹配: error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int' #define NULL 0 ^ 为什么我不能返回NULL或NULL ptr 因为您已经声明了将引用返回int的函数。引用必须始终“指

#定义NULL nullptr
//自C++11以来

在这两种情况下,错误都是类型不匹配:

error: invalid initialization of non-const reference of type 'int&'
       from an rvalue of type 'int'
       #define NULL 0
                    ^
为什么我不能返回NULL或NULL ptr

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

解决方案1:

声明函数以返回指向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
(如果需要,您可以更改实际值)

当然,如果
returni
返回与
nullValue
相同的a值,则函数调用方无法知道函数是否返回了对
nullValue
的引用或某个实际值
i

没有“地址引用”这样的东西。有“引用”,它们不同于指针。C++引用是一种非常强大的语言特性,它不存在于许多其他语言(例如C或java)中。 引用最好被描绘成现有对象的不同名称。或者更好,就像物体本身一样引用就是对象。

这根本不像一个指针。指针本身就是一个碰巧指向其他对象(或不指向任何对象)的对象

他们这样做是出于性能原因

不,他们没有。如果他们这么说,那就没有意义了。您不使用引用来获得性能(至少不是非常量引用),而是使用它们来获得正确性

没有所谓的“空引用”。记住,引用就是对象。因此,这里的
foo
函数返回的实际上是对象本身。不是指向它的指针,不是它的地址,而是对象本身

那么
NULL
nullptr
是什么对象呢?这没有道理。不可能有一个什么都不是的物体

如果您需要能够在业务逻辑中有一个特殊的“nothing”状态,那么您可以使用以下内容。或者也许你真的想要一个指针,毕竟。视情况而定

而不是指针引用

指针引用存在,但它们与示例无关

以下是指针引用:

int main()
{
    int x = 0;
    int* ptr = &x;
    int*& y = ptr; // "y" is now a different name for "ptr"
}
你的回答可能很有见地


< > >强> >简短>回答:在C++中,引用永远不能是代码> null < /C> >(或任何版本的<代码> null >代码> <代码> nulpPTR < /C> >,因为它必须始终是安全的去引用。

空引用是不允许的。“引用应该被初始化为引用有效的对象或函数。[注意:特别是,定义良好的程序中不能存在空引用,因为创建此类引用的唯一方法是将其绑定到通过取消引用空指针获得的“对象”,这会导致未定义的行为。如9.6所述,引用不能直接绑定到位字段。]”源:

违反引用不能为空的规则。不能返回<代码> nulpPTR < /C> >因为它是指针类型,但是int和 >声明返回类型是引用类型。C++没有“地址”的概念,也没有“指针引用”。我建议你仔细阅读指针和引用之间的区别。@Sneftel:我想说“指针引用”只是“指针引用”的俗称,不是吗?我不知道“地址引用”和“指针引用”是什么C++是标准化语言,甚至已经有20年了,你应该假装你从来没有听过C++,在问愚蠢问题之前读一本C++语言来学习语言。谢谢你。在读了第一和第二个答案之后,我明白了我做错了什么。这帮助了我。非常感谢。在阅读了第一个和第二个答案后,我明白了我做错了什么。这对我帮助很大。更糟糕的是,如果
NULL
被定义为
0
,那么
return NULL
将返回对局部变量的引用,该变量将在函数退出时被销毁。@zenith not true,如果#define NULL 0它没有编译,抛出的错误是我粘贴的。这是为了防止你提到的错误。@AB_u你是对的,我的错误。这很有道理。谢谢你的类比。你显然是一个非常聪明的人。谢谢你和我分享你的答案。
int main()
{
    int x = 0;
    int* ptr = &x;
    int*& y = ptr; // "y" is now a different name for "ptr"
}