带默认参数的函数调用
function call with default parameter
我写了一篇关于c++编程的考试。有一个问题我和我的教授意见不一致。问题是,下面的函数是否工作:
#include <iostream>
using namespace std;
void f(int=4, long=10, double=3.14);
int main( int argc , char ** argv )
{
f( , ,8);
return EXIT_SUCCESS;
}
void f(int i, long l, double d) {
cout << i << " " << " " << l << " " << d;
}
我说它不会工作,但我的教授说它肯定会工作,因为函数声明中的默认参数。我用MSVC试过了,但没有用。这是特定于编译器的吗?我怎样才能说服我的教授它在任何编译器中都不起作用,从而在考试中提高我的分数?
首先,你是对的,教授错了。事实上,他声称这应该是可行的(其实很容易证明它不可行),这意味着他可能不应该教c++。但是如何向他展示呢?
试着用至少两个不同的编译器编译它。如果两者都无法编译它,那么很有可能它不是有效代码。那是最快的方法。
如果失败,引用c++标准。下面是调用表达式的语法,如[expr]中所述。Post]p1并在非终结引用之后:
postfix-expression:
...
postfix-expression ( expression-list[opt] )
expression-list:
initializer-list
initializer-list: ([dcl.init]p1)
initializer-clause ...[opt]
initializer-list , initializer-clause ...[opt]
initializer-clause:
assignment-expression
braced-init-list
braced-init-list:
{ initializer-list ,[opt] }
{ }
我不打算列出赋值表达式,但请注意表达式不能是空的,必须至少有一个标记。这意味着初始化子句永远不可能是空的,因此在函数参数的逗号之间必须有一些东西。
来自标准(强调我的,特别注意后面的这个词):
8.3.6默认参数[dcl.fct.default]
如果在形参声明中指定了初始化子句,则该初始化子句被用作默认实参。默认参数将在缺少尾随参数的调用中使用。
[示例:声明
void point(int = 3, int = 4);
声明了一个函数,该函数可以用0、1或2个int型实参调用。它可以通过以下任何一种方式调用:
point(1,2); point(1); point();
后两次调用分别相当于
point(1,4)
和point(3,4)
。- end示例]
享受拿回你的分数。div;)
,甚至不是有效的c++语法。
这可能是因为它只适用于省略的尾随参数,正如msdn所说。试着像这样调用这个函数:
f(); // should use all default values for arguments
f(3); // should use 3 for the first, default for the last two
f(2, 5); // uses 2 for first, 5 for second, default for last
f(5, 6, 3.4); // does not use any default values
相关文章:
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 函数调用C++中的参数太少
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 调用参数排列不变函数 f(i++, i++)
- uncrustify:如何将多行 C 函数调用的参数组合到一行上?
- 函数调用中的参数过多
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 调用参数不是原子参数的函数是此代码引发异常的原因吗?
- 如何在C++中获取lua函数作为参数,然后调用它
- x64 函数调用参数推送/移动顺序 (MSVC)
- 函数调用参数列表 (C++) 中的空格
- 以可变类模板作为函数调用参数的函数模板参数推导
- 函数调用参数中的表达式交错到什么粒度
- 函数调用参数前的双哈希值
- 创建一个向量作为函数调用参数
- 函数调用参数中的构造函数样式转换
- 取消对拆分函数调用参数的信任