2011-08-18 319 views
13

在C++ 0x(哦!讀取C++ 11)中,我們有自動類型推斷。讓我好奇的一件事是我無法創建一個自動變量數組。例如:爲什麼我不能創建一個自動變量數組?

auto A[] = {1, 2, 3, 4}; // Error! 

任何想法爲什麼這可能被禁止?

+3

提到爲什麼每個人都希望濫用新的語言特性的可變參數模板黑客。 –

+3

@Martin:我絕對沒有濫用像C++這樣非常漂亮的語言的意圖。我只是對這個決定背後的原因(技術,道德等)感到好奇。 –

+2

@Martin:在開始盲目運行之前,您必須觸摸表面以瞭解牆壁的位置。 – Klaim

回答

10

auto推導出每個大括號包含的初始化列表爲std::initializer_list<T>。 (請參見包含示例的第7.1.6.4.6節)。 不幸的是,一旦你獲得了它,你就不能初始化一個陣列,或者從std::initializer_list開始std::array,但是你可以使用std::vector

#include <vector> 
#include <array> 
#include <initializer_list> 

int main() 
{ 
    auto x = {1,2,3}; 
    std::array<int, 3> foo1 = x; // won't work for whatever reason 
    std::vector<int> foo2 = x; // works as expected 
    return 0; 
} 

當然,這會破壞你想要做的全部目的。

我試着寫一個叫到身邊make_array工作,但必須認識到,這永遠不能工作作爲initializer_list的大小不是其模板參數的一部分,所以你唯一的實例爲每一個T模板make_array。這很糟糕。

template<typename T> 
auto make_array(const std::initializer_list<T>& x) 
    -> std::array<T, x.size()> { } // maaah 

好吧,顯然你可以去這裏How do I initialize a member array with an initializer_list?

5

因爲{1, 2, 3, 4}純粹是一個句法結構 - 它不是一個表達式,也沒有類型。因此,auto無法從中推斷出它的類型。

+2

這樣的恥辱,我知道已經能夠做多年的語言 – hamstergene

+4

但'auto x = {1,2}'聲明'x'爲'std :: initializer_list '。所以這不完全正確。 – pmr

+1

@DeadMG:好的,那你怎麼看待auto x = {1,2,3,4};?它會不會起作用? x包含什麼值?如果x是1,那麼編譯器現在如何扣除它的類型? –

相關問題