1
int g_myInt = 0;
int& getIntReference() { return g_myInt; }

void myVarArgFunction( int a, ... ) {
  // .........
}

int main() {
  myVarArgFunction( 0, getIntReference() );
  return 0;
}

在上面的(未编译和未经测试的)C++ 代码中,将 anint&传入变量参数列表是否有效?还是仅按值传递是安全的?

4

3 回答 3

2

C++03 标准的第 5.2.2.7 节说首先执行左值到右值的转换,因此您的函数应该接收 int 的副本而不是引用。

我使用 g++ 4.6.3 尝试了这个程序:

#include <iostream>
#include <stdarg.h>

int g_myInt = 7;
int& getIntReference() { return g_myInt; }

void myVarArgFunction( int a, ... )
{
  va_list ap;
  va_start(ap,a);
  int value = va_arg(ap,int);
  va_end(ap);
  std::cerr << value << "\n";
}

int main(int,char **)
{
  myVarArgFunction( 0, getIntReference() );
  return 0;
}

并得到 7 的输出。

于 2012-09-27T04:26:45.567 回答
0

不,传入引用是无效的,因为它是非 POD 类型。

从规范:

如果参数具有非 POD 类类型,则行为未定义。

请参阅有关传递非 POD 的 std::string 的相关问题。
参考代码:http ://codepad.org/v7cVm4ZW

于 2012-09-27T04:17:37.067 回答
-1

是的,您可以像这里一样传递对 int 的引用。如果您在函数 myVarArffunction 中更改了该参数,您将更改全局变量 g_myInt...

于 2012-09-27T04:17:23.027 回答