Редактировать: Это не дублируется связанного вопроса (который также принадлежит мне). Здесь все возвращаемые типы
std::vector
. Я не хочу возвращатьinitializer-list
. Я хочу заполнить возвращенныйstd::vector
наinitializer-list
напрямую
Возьмем эти четыре случая:
1)
//Acceptable
std::vector<int> foo(){
return std::vector<int>{1};
}
2)
//Acceptable
std::vector<int> foo(){
return {1};
}
3)
//Acceptable
std::function<std::vector<int>()> foo=[](){
return std::vector<int>{1};
};
4)
//NOT Acceptable
std::function<std::vector<int>()> foo=[](){
return {1};
};
Почему 4 неприемлемо, если 2 приемлемо? чем они отличаются? Причем, самое странное, что это допустимо:
//Acceptable
auto bar=[]()->std::vector<int>{
return {1};
};
Что не так с std::function
и initializer-list
?
auto bar=[]()->std::vector<int>{
имеет значение, потому что вы явно указываете, что должна вернуть лямбда.std::function<std::vector<int>()> foo=[](){
не считается, потому что вы сначала выводите возвращаемый тип лямбды, а затем присваиваете его. C++ не принимает во внимание, что вы можете назначить лямбда при выборе типа, он видитreturn {1}
, который являетсяstd::initializer_list<int>
(я думаю). - person nwp   schedule 18.06.2016