将引用类型传递给变量参数列表

时间:2012-09-27 03:54:54

标签: c++

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

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

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

在上面的(未编译和未经测试的)C ++代码中,将int&传入变量参数列表是否有效?或者只能安全地传递价值?

3 个答案:

答案 0 :(得分: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的输出。

答案 1 :(得分:0)

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

来自规范:

  

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

在传递std :: string时看到这个related question,这是非POD 参考代码:http://codepad.org/v7cVm4ZW

答案 2 :(得分:-1)

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