我有一个功能,
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
答案 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}
与前两者不同。