默认函数参数的有效表达式

Valid expressions for default function arguments

提问人:Emile Cormier 提问时间:2/15/2012 最后编辑:Emile Cormier 更新时间:6/20/2016 访问量:1255

问:

函数或成员函数中默认参数的有效表达式有哪些可能的类型?

C C++-常见问题

评论

0赞 Kenneth Funk 2/15/2012
你需要更具体。
1赞 Emile Cormier 2/15/2012
我的问题故意笼统。我想知道哪些类型的表达式可以用作默认参数。SO 不仅仅是寻求帮助修复错误。
0赞 anthony sottile 2/15/2012
msdn.microsoft.com/en-us/library/e1dbzf09.aspx
0赞 Cheers and hth. - Alf 2/15/2012
¤ 不能使用的一个特殊表达方式是 。不幸的是,Visual C++ 10.0 接受了它。除此之外,与一般表达式相比,对参数默认表达式没有限制。(除非您正在考虑不可复制的类型或类似类型,这不是对表达式类型的限制,而是对类型的限制)。如果您对语法类别感兴趣,请查阅 C++ BNF 语法。干杯&hth。void()

答:

5赞 lapk 2/15/2012 #1

在赋值给函数参数类型的变量的上下文中正确的任何内容。

编辑
:编译期间的默认参数会根据类型正确性等进行评估,但不会计算这些参数,并且在运行时之前不会进行赋值。您可以将尚未定义的类的构造函数指定为默认参数,这很好,只要在函数使用时定义了类......实际的计算/赋值发生在函数调用期间,而不是在函数声明/定义时。

例:

#include <iostream>

void foo( int a = std::rand())
{
  std::cout << a << std::endl;
}

int main( void )
{
 foo();

 return( 0 );
}

ideone.com 上的程序输出

1804289383

评论

0赞 Emile Cormier 2/15/2012
这是错误的。您可以将只能在运行时确定的变量分配给变量,但不能将它们用作默认参数。例如,你可以做,但你不能做。int a = std::rand()void Class::foo(int a = std::rand())
0赞 Emile Cormier 2/15/2012
哎呀,对不起。我让我错误的先入之见再次占了上风。
1赞 lapk 2/15/2012
@EmileCormier 编译期间的默认参数会根据类型正确性等进行评估,但不会计算它们,并且在运行时之前不会进行赋值。您可以将尚未定义的类的构造函数指定为默认参数,这很好,只要在函数使用时定义了类......实际的计算/赋值发生在函数调用期间,而不是在函数声明/定义时。
0赞 Emile Cormier 2/15/2012
+1 感谢您的澄清,再次对不起我的疯狂滑稽动作。:-)
4赞 Vaughn Cato 2/15/2012 #2

C++ 标准的第 8.3.6 节对此进行了详细说明。它基本上相当于任何不依赖于局部作用域中任何内容的表达式,因此任何依赖于局部变量、函数参数或“this”的表达式都被排除在外。

评论

0赞 Emile Cormier 2/15/2012
这与AzzA的回答相得益彰。我希望我能接受这两个答案。