什么时候不能通过引用传递

时间:2012-12-19 01:33:13

标签: c++ pass-by-reference

我正在阅读关于Why use pointers?的讨论并且遇到Tooony(大多数选票)的答案,其中指出使用指针的一个原因是“当没有办法将变量”引用“传递给a时功能“。

当我们无法通过引用传递变量时,有哪些可能的情况?

还有其他任何我们无法通过参考传递的情况吗?

请开悟我,我想不出任何情况

由于

2 个答案:

答案 0 :(得分:3)

你问,

  

“当我们无法通过引用传递变量时,有哪些可能的情况?”

使用C ++ 11时,有两个主要的情况(可能还有一些我没想到的):

  • 当函数声明也用于C语言绑定时。

  • 当对象是未知边界的数组时。

在后一种情况下,可以想象,可以传递对数组的第一个项的引用,但是然后在函数内部,代码只需要获取地址以便返回数组,而正式类型将这样做不仅不切实际,而且极具误导性。

另外,令我惊讶的是,Visual C ++ 11.0(Visual Studio 2012附带的编译器)编译了以下内容:

#include <iostream>
using namespace std;

void foo( int const (&a)[] )
{
    for( auto p = &a[0]; *p != 0; ++p )
    {
        wcout << *p << endl;
    }
}

extern int const data[];

int main( int argc )
{
    foo( data );
}

int const data[] = {1, 2, 3, 4, 5, 0};

然而,MinGW g ++ 4.7.1拒绝它,因为它应该!


在C ++ 03中确实存在但在C ++ 11中不存在的一个案例是,在C ++ 03中,传递给const的引用的临时对象必须具有可访问的副本构造函数。那是因为在C ++ 03中,允许编译器生成任意数量的副本。在C ++ 11中,必要时可以直接绑定引用。


一个案例,仔细检查是非案例,当你需要表达“不引用对象”的可能性时,就像空指针一样。

例如,

void foo( int const* pValue = 0 ) { if( pValue != 0 ) { ... } }

但是有一些解决方法,包括重载foo

void foo( int const& value ) { ... }
void foo() {}

答案 1 :(得分:2)

引用必须指向初始化内存,即不允许它们为NULL。如果要允许参数不引用函数中的对象,则必须使用指针。

然而,你似乎误读了所写的内容:

在C中,您不支持复杂的数据类型,例如字符串。也无法将“通过引用”变量传递给函数。

具体而言, C 中没有这样的概念作为参考。因此,您必须使用指针。但是,在C ++中,实际上没有地方可以使用在函数参数列表中使用指针的引用。