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

时间:2010-06-30 07:39:40

标签: c++ arguments

我有一个功能,

void test( vector<int>& vec );

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

void test( vector<int>& vec = vector<int>() );

但是有一个警告“使用非标准扩展名:'默认参数':从'std :: vector&lt; _Ty&gt;'转换到'std :: vector&lt; _Ty&gt;&amp;'“

有更好的方法吗?而不是

void test() {
    vector<int> dummy;
    test( dummy );
}

此致 Voteforpedro

6 个答案:

答案 0 :(得分:55)

你试过了吗?

void test(const vector<int>& vec = vector<int>());

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

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

static vector<int> DEFAULT_VECTOR;

void test(vector<int>& vec = DEFAULT_VECTOR);

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


感谢stinky472,这是一个线程安全的选择:

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

void test()
{
  vector<int> vec;
  test(vec);
}

答案 1 :(得分:7)

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

通常,采用非const引用的函数意味着“我可能会更改参数”。如果参数是可选,为什么不传递(非const)指针?这样,当呼叫者不想传递参数时,他们可以通过NULL (有关如何传递函数参数的详细信息,请参阅 here 。)

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

答案 2 :(得分:3)

我们无法初始化对临时数的可变引用。只有const引用允许这样做。你最喜欢的是:

void test( const vector<int>& vec = vector<int>() );

除了避免未定义的行为之外,从逻辑上和const-correctness的角度来看,这是最有意义的。如果你想要'test'来修改传递给它的原始向量,你将无法合理地提供默认值。因此很明显,你在这里使用'vec'是为了只读目的,因此应该把它作为const引用。

答案 3 :(得分:1)

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

void test( vector<int>& vec = {}) {
      // Awesome code here
}

正如this answer中指出的那样。

答案 4 :(得分:0)

你可以只传递指向矢量的指针并将其初始化为NULL

void test( vector<int>* vec = NULL );

答案 5 :(得分:0)

我知道这个问题是在大约 10 年前提出的。但是对于现在找到解决方案的任何人,我已经为您准备好了。我基本上有三种不同的方法:

void test(vector<int>vec = vector<int>(10, 0){//definition}

如果默认向量具有给定大小且具有公共初始化值,则可以使用它。

void test(vector<int>vec = vector<int>{1, 2, 3, 4}){//definition}

如果默认向量具有给定大小并具有不同的初始化器值,则可以使用它。

另一种方法是将全局向量对象定义为:

vector<int> globalvector;

(初始化或未初始化)并将此对象作为默认值传递

void test(vector<int>vec = globalvector){//definition}

最后一个的一个重要好处是它提供了对默认值本身的更多控制,因为函数可用于在控制到达 globalvector 函数之前为这个 test() 赋值。另一个好处是(到目前为止我还没有发现),如果函数涉及通过引用传递,它的工作原理与:

void test(vector<int>& vec = globalvector){//definition}

与前两者不同。