C++ vector <int>&的默认参数?

vot*_*dro 31 c++ arguments

我有一个功能,

void test( vector<int>& vec );
Run Code Online (Sandbox Code Playgroud)

如何设置vec的默认参数?我试过了

void test( vector<int>& vec = vector<int>() );
Run Code Online (Sandbox Code Playgroud)

但是有一个警告"使用非标准扩展:'默认参数':从'std :: vector <_Ty>'转换为'std :: vector <_Ty>&'"

有一个更好的方法吗 ?代替

void test() {
    vector<int> dummy;
    test( dummy );
}
Run Code Online (Sandbox Code Playgroud)

此致,Voteforpedro

ere*_*eOn 60

你有没有尝试过:

void test(const vector<int>& vec = vector<int>());
Run Code Online (Sandbox Code Playgroud)

C++ 不允许temporaries绑定到非const引用.

如果你真的需要一个vector<int>&(不是const一个),你可以声明一个静态实例并将其用作默认值(因此是非临时的).

static vector<int> DEFAULT_VECTOR;

void test(vector<int>& vec = DEFAULT_VECTOR);
Run Code Online (Sandbox Code Playgroud)

但请注意,因为DEFAULT_VECTOR将被修改,并且不会在每次调用时重置!不确定这是你真正想要的.


感谢stinky472,这是一个线程安全的替代方案:

您也可以test()使用调用其他版本的零参数版本重载,而不是提供默认值:

void test()
{
  vector<int> vec;
  test(vec);
}
Run Code Online (Sandbox Code Playgroud)

  • +1但我认为应该指出,如果要修改'DEFAULT_VECTOR','test'通常不会是线程安全的.这可能是单调乏味的,但我强烈建议为这些需求编写两个函数(一个可以重用另一个):void test(){vector <int> temp; 试验(温度); } (7认同)

sbi*_*sbi 7

我发现非const引用参数有一个默认值是有问题的.这应该是什么意思?

通常,采用非const引用的函数意味着"我可以改变论证".如果参数是可选的,为什么不传递(非const)指针?这样,当调用者不想传递参数时,他们可以传递NULL.
(有关如何传递函数参数的更多信息,请参见此处.)

编辑:嗯,当然,还有超载.只需添加另一个不带此参数的重载.

  • @DeadMG:你指的是我破碎的语法子系统吗? (5认同)
  • 我会做那样的事吗? (2认同)

小智 7

您可以只传递一个指向向量的指针并将其初始化为 NULL

void test( vector<int>* vec = NULL );
Run Code Online (Sandbox Code Playgroud)


Joh*_*ohn 5

我知道这个问题是在 2010 年提出的,但对于 C++11 你可以这样做:

void test( vector<int>& vec = {}) {
      // Awesome code here
}
Run Code Online (Sandbox Code Playgroud)

正如这个答案所指出的。

  • 这与问题中的“void test( vector&lt;int&gt;&amp; vec = vector&lt;int&gt;() );”具有相同的含义,由于尝试将临时值绑定到非常量引用,因此这是非法的。在您链接到的答案中,它不是参考。 (5认同)