初始化列表表達式是初始化C++容器真是太方便了:轉發初始化列表表達式
std::vector<int>({1, 2, 3})
...但它似乎是一個括號內的初始化列表表達式,如{1,2,3}
將只綁定到一個函數這需要一個std::initializer_list<int>
- 它不似乎綁定到通用(轉發)參考:
template <class T>
void foo(T&& v)
{
std::vector<int>(std::forward<T>(v));
}
int main()
{
foo({1, 2, 3})
}
個
此輸出:
test2.cpp:11:6: note: template<class U> void foo(U&&)
test2.cpp:11:6: note: template argument deduction/substitution failed:
test2.cpp:33:13: note: couldn't deduce template parameter ‘U’
(這與GCC 4.7.2的結果。)
這不幸意味着我們不能轉發初始化列表表達。既然這樣做會非常方便,我想問問爲什麼這不起作用?爲什麼大括號初始化程序列表表達式不能綁定到轉發引用?或者這是允許的,也許我的編譯器太老了?
轉發'initializer_list'沒有用:它已經有引用語義,其元素是const的,因此不可移動。 – dyp 2015-02-06 17:07:10
無關緊要,它們是否可移動 - 通用轉發參考不一定意味着移動,它只是意味着沿參數轉發,因爲 – Siler 2015-02-06 17:08:12
是的,但是braced-init-list沒有類型。因此,你不能「原樣」轉發它。 – dyp 2015-02-06 17:09:05