我对函数参数列表中的默认值有一些疑问
-
默认值是签名的一部分吗?默认参数的参数类型怎么样?
-
默认值存储在哪里?在堆栈或全局堆中还是在常量数据段中?
否,默认argument不是签名的一部分,也不是函数类型的一部分。
参数类型是签名的一部分。但默认参数类型对参数类型没有影响,即默认参数类型对签名没有影响。
默认参数没有“存储”在任何特定的地方。默认参数是“语法糖”,仅在程序编译期间存在(作为默认参数)。如果在编译过程中编译器发现缺少某些参数,它将使用您指定的默认参数。默认参数的计算是在调用者的上下文中完成的。如果指定临时对象作为默认参数,则每次使用默认参数调用函数时都会创建一个单独的临时对象,并在调用表达式结束后立即销毁。
void foo(T t = T());
// A new temporary will be used as an argument every time you call it as `foo()`
foo();
// Equivalent to `foo(T())`. A temporary is created here, passed as an argument and
// destroyed afterwards, just like an explicit temporary would be
如果您指定具有静态存储持续时间的现有对象作为默认参数,那么它将存储在您定义的任何位置。
T global;
void foo(T& t = global);
// In this case you are using a global object as a default argument
// It is you who "store" it wherever you want to store it
foo();
// Equivalent to `foo(global)`
如果您声明默认参数但从未实际使用它们,即如果您每次都明确指定参数,那么编译后的程序将不会有任何这些参数的痕迹(这就是为什么我称它们为编译时“语法糖”)。
附:包含约翰内斯在下面的评论中所说的内容:即使默认参数(使用时)在调用时在调用者的上下文中进行评估,它也不是通过“文本替换”来完成的,正如我的示例中可能出现的那样多于。最值得注意的是,默认参数中使用的名称的名称查找是在函数声明中指定默认参数时完成的,而不是在调用者中求值时完成的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)