<分区>
所以,在离开 C++ 20 年后,我又回到了它。我一辈子都无法解决这个问题。如果我传递地址引用而不是指针引用,我正在使用 [at work] 类。下面这个小 foo() 示例,为什么我不能返回 NULL 或 nullptr?我忘记了违反了什么规则?
int& foo(int &i)
{
if (i > 10)
{
// or return nullptr;
return NULL;
}
return i;
}
<分区>
所以,在离开 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 的函数。引用必须始终“指向”存在的实际 int
。 nullptr
因此不是有效值。 (空指针不能转换为对 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/