3

我试图做这样的事情:

int& g(int& number = 0)
{
//maybe do something with number
    return number;
}

但它不起作用。它必须通过引用传递。感谢您的任何帮助。

PS我认为一旦你输入标题就出现“相关问题”是个好主意,但我也认为只有当它们与特定语言相关时才应该显示它们,即用类似的主题来查看对我来说没什么用问题,但在 Ruby 中。

4

4 回答 4

11

如果你真的想这样做:

  • 将引用设为 const,以便可以将临时对象绑定到它
  • 将默认值放在函数声明中,而不是定义中

例如:

// header
const int & g( const int & number = 0 );


// implementation
const int & g( const int & number )
{
//maybe do something with number
    return number;
}

PS 发布您对 SO 在 Meta 上的工作方式的投诉,而不是在这里(尽管它会做的所有好处 - 回答这个问题表明他们仍然没有修复 code-after-list 错误)

于 2009-12-14T10:06:04.310 回答
4

您有一个非常量引用,这意味着您可以修改引用。但您的默认值是常数0。

这个函数有默认值真的有意义吗?

于 2009-12-14T10:07:57.533 回答
0

非常量引用不能绑定到临时(文字)。

在这里,接受参数并按值返回可能最有意义,并将其留给调用者将结果分配回变量(如果他们想要的话):k = g(k);

也许你也可以使用两个重载,但是“默认”的一个不能通过引用返回,这可能会导致一些混乱:

int& g(int&);

int g()
{ 
    int arg = 0;
    return g(arg);
}
于 2009-12-14T10:47:16.460 回答
0

你的成语是错误的。

一个全局函数基本上不应该返回一个引用——除了隐藏一个全局变量。这种情况是可以接受的,但是,使用是有问题的:如果变量已经是全局的,为什么将它隐藏在函数调用后面?

如果您的目标是修改参数,那么为什么要给出返回值?仅当您返回旧值时才有用 - 并且必须“按值”而不是“按引用”完成。


int g(int& arg) {
   int oldarg( arg );
   // maybe modify arg
   // return old value of arg
   return oldarg;
}

或者:


const int& g(int& arg) {
    static int accumulator;
    accumulator += arg;
    return accumulator;
}

在后一种情况下,通过引用传递参数和/或通过引用返回累加器是不必要的。

干杯,H。

于 2009-12-14T12:27:03.023 回答