Сообщение Re[3]: Правомерно ли такое от 18.08.2020 7:31
Изменено 18.08.2020 7:41 Маркуша Шулин
Re[3]: Правомерно ли такое
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, ollv, Вы писали:
BFE>Сигфолта не будет, т.к. не скомпилируется.
Да на gcc compile rvalue не ляжет в ссылку. просто майкрософт ведет себя вероломно. Т/к/ он мало того, что компилирует, так еще и без ворнингов (с настройками по умолчанию). Его конечно можно нагнуть, чтобы такое не компилировалось
+ к тому есть продление жизни для ссылок — тоже опасное поведение. В общем, я могу сказать одна я такие практики оч не поддерживаю.
такое скомпилируется и может даже имеет какой-то смысл. Но изначально — r& fun(type& v) { return v; }
я пытаюсь избегать, именно по причине того, что майкрософт ведет себя вероломно.
BFE>Но даже если добавить функцию:
BFE>
BFE>Даже тогда Сигфолта не будет, т.к. std::vector<int>() должен дожить до конца выполнения выражения push_back_helper( std::vector<int>(), i );, которое включает в себя копирование вектора в возвращаемый результат
BFE>
зачем тут мув семантика вообще непонятно. я вообще не понимаю зачем весь этот сырбор, если РВО помогает мейкать вектора и прочие объекты без потерь
все уже сделано в решениях вида std::make_shared_ptr и прочих bind. Параметры муваются, объекты создаются и возвращаются без потерь.
BFE>Здравствуйте, ollv, Вы писали:
Скрытый текст | |
M>>>
BFE> O>> Под gcc будет сигфолт, после передачи инстанса вектора он умрет при свертке стека (а именно после возврата из push_back_helper(std::vector<int>(), ... ) )У майкрософта была какая-то "оптимизация" по продлению жизни ссылки | |
BFE>Сигфолта не будет, т.к. не скомпилируется.
Да на gcc compile rvalue не ляжет в ссылку. просто майкрософт ведет себя вероломно. Т/к/ он мало того, что компилирует, так еще и без ворнингов (с настройками по умолчанию). Его конечно можно нагнуть, чтобы такое не компилировалось
+ к тому есть продление жизни для ссылок — тоже опасное поведение. В общем, я могу сказать одна я такие практики оч не поддерживаю.
такое скомпилируется и может даже имеет какой-то смысл. Но изначально — r& fun(type& v) { return v; }
я пытаюсь избегать, именно по причине того, что майкрософт ведет себя вероломно.
inline
std::vector<int> makeVec( int i )
{
std::vector<int> r;
return push_back_helper(r, i );
}
BFE>Но даже если добавить функцию:
BFE>
BFE>template<typename ItemType>
BFE>inline std::vector<ItemType>& push_back_helper( std::vector<ItemType>&& v, const ItemType &elem )
BFE>{
BFE> v.push_back(elem);
BFE> return v;
BFE>}
BFE>
BFE>Даже тогда Сигфолта не будет, т.к. std::vector<int>() должен дожить до конца выполнения выражения push_back_helper( std::vector<int>(), i );, которое включает в себя копирование вектора в возвращаемый результат
BFE>
BFE>inline
BFE>std::vector<int> makeVec( int i )
BFE>{
BFE> return push_back_helper( std::vector<int>(), i );
BFE>}
BFE>
зачем тут мув семантика вообще непонятно. я вообще не понимаю зачем весь этот сырбор, если РВО помогает мейкать вектора и прочие объекты без потерь
все уже сделано в решениях вида std::make_shared_ptr и прочих bind. Параметры муваются, объекты создаются и возвращаются без потерь.
Re[3]: Правомерно ли такое
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, ollv, Вы писали:
BFE>Сигфолта не будет, т.к. не скомпилируется.
Да на gcc compile rvalue не ляжет в ссылку. просто майкрософт ведет себя вероломно. Т/к/ он мало того, что компилирует, так еще и без ворнингов (с настройками по умолчанию). Его конечно можно нагнуть, чтобы такое не компилировалось
+ к тому есть продление жизни для ссылок — тоже опасное поведение. В общем, я могу сказать одна я такие практики оч не поддерживаю.
такое скомпилируется и может даже имеет какой-то смысл. Но изначально — r& fun(type& v) { return v; }
я пытаюсь избегать, именно по причине того, что майкрософт ведет себя вероломно.
BFE>Но даже если добавить функцию:
BFE>
BFE>Даже тогда Сигфолта не будет, т.к. std::vector<int>() должен дожить до конца выполнения выражения push_back_helper( std::vector<int>(), i );, которое включает в себя копирование вектора в возвращаемый результат
BFE>
зачем тут мув семантика вообще непонятно. я вообще не понимаю зачем весь этот сырбор, если РВО помогает мейкать вектора и прочие объекты без потерь
все уже сделано в решениях вида std::make_shared_ptr и прочих bind. Параметры муваются, объекты создаются и возвращаются без потерь.
BFE>Здравствуйте, ollv, Вы писали:
Скрытый текст | |
M>>>
BFE> O>> Под gcc будет сигфолт, после передачи инстанса вектора он умрет при свертке стека (а именно после возврата из push_back_helper(std::vector<int>(), ... ) )У майкрософта была какая-то "оптимизация" по продлению жизни ссылки | |
BFE>Сигфолта не будет, т.к. не скомпилируется.
Да на gcc compile rvalue не ляжет в ссылку. просто майкрософт ведет себя вероломно. Т/к/ он мало того, что компилирует, так еще и без ворнингов (с настройками по умолчанию). Его конечно можно нагнуть, чтобы такое не компилировалось
+ к тому есть продление жизни для ссылок — тоже опасное поведение. В общем, я могу сказать одна я такие практики оч не поддерживаю.
такое скомпилируется и может даже имеет какой-то смысл. Но изначально — r& fun(type& v) { return v; }
я пытаюсь избегать, именно по причине того, что майкрософт ведет себя вероломно.
inline
std::vector<int> makeVec( int i )
{
std::vector<int> r;
return push_back_helper(r, i );
}
BFE>Но даже если добавить функцию:
BFE>
BFE>template<typename ItemType>
BFE>inline std::vector<ItemType>& push_back_helper( std::vector<ItemType>&& v, const ItemType &elem )
BFE>{
BFE> v.push_back(elem);
BFE> return v;
BFE>}
BFE>
BFE>Даже тогда Сигфолта не будет, т.к. std::vector<int>() должен дожить до конца выполнения выражения push_back_helper( std::vector<int>(), i );, которое включает в себя копирование вектора в возвращаемый результат
BFE>
BFE>inline
BFE>std::vector<int> makeVec( int i )
BFE>{
BFE> return push_back_helper( std::vector<int>(), i );
BFE>}
BFE>
зачем тут мув семантика вообще непонятно. я вообще не понимаю зачем весь этот сырбор, если РВО помогает мейкать вектора и прочие объекты без потерь
все уже сделано в решениях вида std::make_shared_ptr и прочих bind. Параметры муваются, объекты создаются и возвращаются без потерь.