2017-08-27 27 views
0

看來在函數中傳遞的參數不能保持它們的const屬性。 假設我需要使用函數內參數的信息來初始化const變量,然後創建一個數組類型。我能怎麼做?如何在函數中傳遞const變量?

例如:

#include <array> 
using namespace std; 

void foo(const int info) 
{ 
    const int num = info + 1; // seems num cannot be constant 
    array<int, num> arr; 
} 

編譯錯誤:

test.cpp: In function ‘void foo(int)’: 
test.cpp:8:16: error: the value of ‘num’ is not usable in a constant expression 
array<int, num> arr; 
      ^
test.cpp:7:15: note: ‘num’ was not initialized with a constant expression 
    const int num = info + 1; // seems num cannot be constant 
      ^

更新:使用數組類型會造成這樣的麻煩,但使用簡單類型數組 只是確定:

void foo(int info) 
{ 
    int array[info]; 
} 

是不是info應該在編譯期間分配?

+1

什麼是你得到實際的編譯器錯誤?請注意,您不能使用運行時變量作爲模板參數參數(「const」與「constexpr」不同)。 – Dai

+1

如果你想用它作爲數組的大小,Num需要是編譯時常量嗎? 'const'意味着它不能被重新分配,而不是它在編譯時是一個常量。afaik – Carcigenicate

+1

std :: array需要一個編譯時常量。函數參數不能是編譯時常量。你需要std :: vector來代替。 –

回答

1

在C++中有constconstexpr之間的差異:Difference between `constexpr` and `const`

在你的情況,你要創建一個編譯時大小的數組,這需要一個constexpr。 constexpr不能簡單地作爲const變量函數參數。您可以改爲使用constexpr,也可以使用vector(運行時大小的數組)而不是array

+0

非常感謝,我閱讀了關於constexpr,但仍然無法理解如何將一個函數參數用作constexpr。你可以給我一個例子嗎? – JiangFeng

+0

@JiangFeng:如果你想讓一個函數參數成爲一個constexpr,你可以將它作爲一個模板參數,如Jeff Garrett的答案所示。正如你所做的那樣,你無法將其定爲常規論點。大多數情況下,你應該使用'vector'而不是'array'來處理這類代碼。 –

0

如果你需要一個動態大小的數組,你不需要std :: array的特定屬性,那麼你可以使用vector。

主要區別是:

std::array is a template class that encapsulate a statically-sized array, stored inside the object itself, which means that, if you instantiate the class on the stack, the array itself will be on the stack. Its size has to be known at compile time (it's passed as a template parameter), and it cannot grow or shrink.

載體內部,但是,被存儲在堆上。

來自:https://stackoverflow.com/a/4424658/128581

另外的std ::陣列是平凡能夠複製(這意味着你可以從一個地方memcpy的到另一個,而不必擔心)如果類型T是平凡能夠複製。

使用載體,如:

void foo(size_t size) 
{ 
    vector<int> arr(size); 
} 
1

如果用gcc -pedantic編譯,你會看到int array[info]也沒有標準的C++。見the GCC docs。完成問題的目標

一種方式是一個非類型模板參數:

#include <array> 

template<int info> 
void foo() 
{ 
    constexpr int num = info + 1; 
    std::array<int, num> arr; // or int arr[num] 
} 
// Call as foo<3>()