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

标签 c++ pass-by-reference

我正在阅读关于 Why use pointers? 的讨论并遇到了 Tooony 的回答(大多数票数),其中指出使用指针的一个原因是“当无法将变量“通过引用”传递给函数时”。

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

是否存在其他我们无法通过引用传递的情况?

请赐教,我想不出任何情况

谢谢

最佳答案

你问,

“What are the possible cases when we cannot pass a variable by reference?”

对于 C++11,有两种主要的此类情况(也许还有一些我没有想到的情况):

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

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

在后一种情况下,可以想象,可以传递对数组第一项的引用,但在函数内部,代码只需获取地址即可恢复数组性质,并且形式类型将这种方式不仅不切实际,而且极具误导性。

此外,令我惊讶的是 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 中,如果可能的话,必须直接绑定(bind)引用。


仔细检查后发现并非如此的一种情况是,当您需要表达“不引用对象”(如空指针)的可能性时。

例如,

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

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

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

关于c++ - 什么时候不能通过引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13944318/

相关文章:

PHP:只能通过引用传递变量

c++ - 什么时候在 C++ 中使用引用?

c++ - 如何创建可以影响通过构造函数传递的对象的类变量?

c++ - 转换宽字符串以 boost 日期

c++ - 尝试编译 MixKit 库时出错 (C++)

c++ - 当基类指针指向在基类中声明的派生类虚函数时,为什么会出现编译时错误?

c# - 通过引用传递 IDisposable 对象会导致错误?

c++ - 错误代码 2556,2040

c++ - 如何分配堆指针

c - 当我将它作为指向通过 C 中另一个函数的函数的指针的引用传递时,兼容的指针类型是什么?