将引用类型传递到变量参数列表中 在(未编译和未测试)C++代码中,将 int和传递到变量参数列表是否有效?或者只通过值传递是安全的吗?

将引用类型传递到变量参数列表中 在(未编译和未测试)C++代码中,将 int和传递到变量参数列表是否有效?或者只通过值传递是安全的吗?,c++,C++,是的,您可以像这里一样传递对int的引用。如果在函数MyVarArffFunction中更改该参数,您将更改全局变量g_myInt…是的,您可以像这里一样传递对int的引用。如果在函数MyVarArffFunction中更改该参数,则将更改全局变量g_myInt…否,传入引用无效,因为它是非POD类型 根据规范: 如果参数具有非POD类类型,则行为未定义 在传递std::string时可以看到这一点,它是非POD的。 引用代码:否,传入引用无效,因为它是非POD类型 根据规范: 如果参数具有非P

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

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

否,传入引用无效,因为它是非POD类型

根据规范:

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

在传递std::string时可以看到这一点,它是非POD的。

引用代码:

否,传入引用无效,因为它是非POD类型

根据规范:

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

在传递std::string时可以看到这一点,它是非POD的。

参考代码:

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

我使用g++4.6.3使用此程序进行了尝试:

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

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

int main() {
  myVarArgFunction( 0, getIntReference() );
  return 0;
}
#包括
#包括
int g_myInt=7;
int&getIntReference(){return g_myInt;}
void myVarArgFunction(int a,…)
{
va_列表ap;
va_启动(ap,a);
int值=va_arg(ap,int);
va_端(ap);

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

我使用g++4.6.3使用此程序进行了尝试:

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

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

int main() {
  myVarArgFunction( 0, getIntReference() );
  return 0;
}
#包括
#包括
int g_myInt=7;
int&getIntReference(){return g_myInt;}
void myVarArgFunction(int a,…)
{
va_列表ap;
va_启动(ap,a);
int值=va_arg(ap,int);
va_端(ap);

std::cerr你可以在类似codepad的东西上试用…粘贴链接:为什么你还没有编译和测试它?@VaughnCato这不是学习标准行为的可靠方法。它可能在MSVC上有效,而在其他平台上无效。同意,但我认为这将是一个很好的第一步。仅供参考:g++4.6.3没有抱怨。你可以在类似codepad的东西上试用。。.paste link:你为什么没有编译和测试它?@VaughnCato这不是学习标准行为的可靠方法。它可能在MSVC上工作,而在其他平台上不起作用。同意,但我认为这是一个很好的第一步。仅供参考:g++4.6.3没有抱怨。我想你脑子里有一种不同的语言。(或者你把引用和指针混淆了。)va_uu东西不做引用,所以它们被转换成右值。我想你脑子里想的是另一种语言。(或者你把引用和指针混淆了。)va_uu东西不做引用,所以它们被转换成右值。表达式
getIntReference()
的type
int
是POD类型。表达式
getIntReference()
的type
int
是POD类型。