我写了一篇关于 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] }
{ }
我不打算列出赋值表达式,但请注意,表达式永远不能什么都不是,必须至少有一个标记。这意味着初始化子句永远不能什么都没有,因此函数参数中的逗号之间总是必须有一些东西。
关于c++ - 带默认参数的函数调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16698813/