【问题标题】:function call with default parameter带默认参数的函数调用
【发布时间】:2013-05-31 03:18:37
【问题描述】:

我写了一篇关于 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++11 function-call default-parameters


    【解决方案1】:

    首先,你是对的,教授错了。而且他声称这应该有效(当证明它无效时)这一事实意味着他可能不应该教 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] }
        { }
    

    我不打算列出 assignment-expression,但请注意,一个表达式不可能什么都不是,必须至少有一个标记。这意味着初始化子句永远不能什么都不是,因此函数参数中的逗号之间总是必须有一些东西。

    【讨论】:

    • 谢谢,现在我可以提供完美的反驳了
    【解决方案2】:

    来自标准(强调我的,特别注意单词trailing):

    8.3.6 默认参数 [dcl.fct.default]

    1. 如果在参数声明中指定了初始化子句,则该初始化子句用作默认参数。 默认参数将用于缺少尾随参数的调用。

    2. [示例:声明

    void point(int = 3, int = 4);

    声明一个可以使用零个、一个或两个 int 类型参数调用的函数。可以通过以下任何方式调用它:

    point(1,2); point(1); point();
    

    最后两个调用分别相当于point(1,4)point(3,4)

    —结束示例]

    享受拿回积分的乐趣。 ;)

    【讨论】:

    • 谢谢你只允许省略尾随参数,听起来是一个很好的参数:) 我会试着用这种方式向他解释。
    【解决方案3】:

    这甚至不是有效的 C++ 语法

    【讨论】:

    • @tom1991te:你不能说f( , , 8)。这是不允许的。
    • 是的,我知道这是我的问题 :) 我知道这是无效的,但我的教授不知道 :D
    • @KerrekSB:不是 that 没有意义,因为教授因此从 OP 的测试中删除了分数。 ;)
    【解决方案4】:

    这可能是因为它只适用于省略的尾随参数,正如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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      相关资源
      最近更新 更多