Re[2]: Правомерно ли такое
От: B0FEE664  
Дата: 17.08.20 12:47
Оценка:
Здравствуйте, ollv, Вы писали:

  Скрытый текст
M>>
M>>template<typename ItemType>
M>>inline
M>>std::vector<ItemType>& push_back_helper( std::vector<ItemType> &v, const ItemType &elem )
M>>{
M>>    v.push_back(elem);
M>>    return v;
M>>}

M>>inline
M>>std::vector<int> makeVec( int i )
M>>{
M>>    return push_back_helper( std::vector<int>(), i );
M>>}

M>>int main()
M>>{
M>>    auto v = makeVec( 3 );
M>>}
M>>

O> Под gcc будет сигфолт, после передачи инстанса вектора он умрет при свертке стека (а именно после возврата из push_back_helper(std::vector<int>(), ... ) )У майкрософта была какая-то "оптимизация" по продлению жизни ссылки
Сигфолта не будет, т.к. не скомпилируется.
Но даже если добавить функцию:
template<typename ItemType>
inline std::vector<ItemType>& push_back_helper( std::vector<ItemType>&& v, const ItemType &elem )
{
    v.push_back(elem);
    return v;
}

Даже тогда Сигфолта не будет, т.к. std::vector<int>() должен дожить до конца выполнения выражения push_back_helper( std::vector<int>(), i );, которое включает в себя копирование вектора в возвращаемый результат
inline
std::vector<int> makeVec( int i )
{
   return push_back_helper( std::vector<int>(), i );
}
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.