[英]C++ Default argument for vector<int>&?
我有一個功能,
void test( vector<int>& vec );
如何為 vec 設置默認參數? 我試過了
void test( vector<int>& vec = vector<int>() );
但是有一個警告“使用了非標准擴展:‘默認參數’:從‘std::vector<_Ty>’轉換為‘std::vector<_Ty> &’”
有一個更好的方法嗎 ? 代替
void test() {
vector<int> dummy;
test( dummy );
}
問候, Voteforpedro
你有沒有嘗試過:
void test(const vector<int>& vec = vector<int>());
C++
不允許將臨時對象綁定到非常量引用。
如果您真的需要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);
}
我發現非const
引用參數具有默認值是有問題的。 這是什么意思?
通常,采用非const
引用的const
意味着“我可能會更改參數”。 如果參數是可選的,為什么不傳遞(非const
)指針? 這樣,當調用者不想傳遞參數時,他們可以傳遞NULL
。
(有關如何傳遞函數參數的更多信息,請參見此處。)
編輯:嗯,當然,還有重載. 只需添加另一個不接受此參數的重載。
我們無法初始化對臨時對象的可變引用。 只有 const 引用允許這樣做。 你所追求的很可能是這樣的:
void test( const vector<int>& vec = vector<int>() );
除了避免未定義的行為之外,這在邏輯上和從常量正確性的角度來看是最有意義的。 如果您希望 'test' 修改傳遞給它的原始向量,您將無法明智地提供默認值。 因此,很明顯,您在此處將 'vec' 用於只讀目的,因此應將其設為 const 引用。
我知道這個問題是在 2010 年提出的,但對於 C++11,你可以這樣做:
void test( vector<int>& vec = {}) {
// Awesome code here
}
正如在這個答案中指出的那樣。
您可以只傳遞一個指向向量的指針並將其初始化為 NULL
void test( vector<int>* vec = NULL );
我知道這個問題是大約 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}
最后一個的一個重要好處是它可以更好地控制默認值本身,因為可以使用函數在控制到達test()
函數之前將值分配給這個globalvector
。 另一個好處是(據我所知),如果函數涉及通過引用傳遞,則它的工作原理與:
void test(vector<int>& vec = globalvector){//definition}
與前兩者不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.