在C++ 0x(哦!讀取C++ 11)中,我們有自動類型推斷。讓我好奇的一件事是我無法創建一個自動變量數組。例如:爲什麼我不能創建一個自動變量數組?
auto A[] = {1, 2, 3, 4}; // Error!
任何想法爲什麼這可能被禁止?
在C++ 0x(哦!讀取C++ 11)中,我們有自動類型推斷。讓我好奇的一件事是我無法創建一個自動變量數組。例如:爲什麼我不能創建一個自動變量數組?
auto A[] = {1, 2, 3, 4}; // Error!
任何想法爲什麼這可能被禁止?
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?
因爲{1, 2, 3, 4}
純粹是一個句法結構 - 它不是一個表達式,也沒有類型。因此,auto
無法從中推斷出它的類型。
這樣的恥辱,我知道已經能夠做多年的語言 – hamstergene
但'auto x = {1,2}'聲明'x'爲'std :: initializer_list
@DeadMG:好的,那你怎麼看待auto x = {1,2,3,4};?它會不會起作用? x包含什麼值?如果x是1,那麼編譯器現在如何扣除它的類型? –
提到爲什麼每個人都希望濫用新的語言特性的可變參數模板黑客。 –
@Martin:我絕對沒有濫用像C++這樣非常漂亮的語言的意圖。我只是對這個決定背後的原因(技術,道德等)感到好奇。 –
@Martin:在開始盲目運行之前,您必須觸摸表面以瞭解牆壁的位置。 – Klaim