簡體   English   中英

C++ 向量的默認參數<int> &amp;?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM