2010-06-30 68 views
22

我有一个功能,C++矢量的默认参数<int>&?

void test(vector<int>& vec); 

我如何设置VEC的默认参数? 我试图

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

但有一个警告 “使用非标准扩展: '默认参数':转换,从 '的std ::矢量< _Ty>' 到 '的std ::矢量< _Ty> &'”

有没有更好的方法来做到这一点?取而代之的

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

问候, Voteforpedro

回答

43

你试过:

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

C++不允许临时变量绑定到非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); 
} 
+4

+1但我认为应该指出,'测试'通常不会线程安全的,因为它修改这个'DEFAULT_VECTOR'。这可能很乏味,但我强烈建议为这些需求编写两个函数(一个可以重用另一个函数):void test(){vector temp;试验(温度); } – stinky472 2010-06-30 08:45:43

+0

@ stinky472:谢谢,更新了我的答案。 – ereOn 2010-06-30 09:04:47

+1

作为一个方面说明,如果你可以在后者上使用某种方法来返回对它自己的引用,例如获取对临时引用的一种方法。 '操作者='。因此,'无效测试(向量&vec =向量().operator =(向量()));'应该工作(临时生命在这里不受影响并且仍然足以处理呼叫)。但请不要这样做:) – 2010-06-30 14:59:01

7

我觉得有一个非const参考参数具有默认值的问题。这是什么意思?

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

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

+0

你觉得它有问题吗? – Puppy 2010-06-30 08:13:34

+3

@DeadMG:你是指我破碎的语法子系统吗? – sbi 2010-06-30 08:51:38

+1

我会做那样的事吗? – Puppy 2010-06-30 08:57:00

3

我们无法初始化临时对象的可变引用。只有const引用允许这样做。你是什​​么之后,最有可能是这样的:

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

除了避免不确定的行为,这是很有道理的逻辑,并从一个const,正确性的观点。如果你想'测试'来修改传递给它的原始矢量,你就不会明智地提供默认值。因此,显然你在这里使用'vec'作为只读目的,因此应该使它成为一个const引用。

+2

您无法直接初始化临时对象的可变引用。临时不会绑定到非const引用 - 如果您尝试这样做,它不是U.B.,它是格式错误的输入(即编译器错误)。 VC++可以让你做到这一点,但正确地指出它是一种语言扩展。 – 2010-06-30 07:52:03

+0

@Pavel啊好点!我见过令人讨厌的编译器,这些编译器允许MSVC和过去版本的CodeWarrior代码生成但崩溃的行为。我将相应地修改帖子以确保准确性。感谢您指出。 – stinky472 2010-06-30 08:00:20

-1

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

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

正如this answer指出。

+0

这与'void test(向量&vec =向量());'在问题中相同,因为试图将临时绑定到非const引用是非法的。在你连接的答案中,这不是一个参考。 – 2017-08-20 05:21:39