вопрос по functors c++
WAT
почему при передаче функторов другой функции они передаются по значению, а не по ссылке?применительно к c++
почему при передаче функторов другой функции они передаются по ссылке, а не по значению?
почему при передаче функторов другой функции они передаются по значению, а не по указателю?
почему при передаче функторов другой функции они передаются по указателю, а не по ссылке?
почему при передаче функторов другой функции они передаются по ссылке и получается Access Violation?
почему при передаче функторов другой функции они передаются по ссылке и получается ошибка типа cannot convert?
короче код покажи, с c++ телепатия плохо работает
Гугль не помог
:

:
Мне кажется тс хотел узнать, почему в C++, во всяком случае в стандартной библиотеке C++, принято передавать функторы по значению.
Каких-то явных преимуществ ИМХО в этом подходе нет, просто так принято.
Каких-то явных преимуществ ИМХО в этом подходе нет, просто так принято.
Каких-то явных преимуществ ИМХО в этом подходе нетну типа за временем жизни следить не приходится.
тс хотел узнать, почему в C++, во всяком случае в стандартной библиотеке C++, принято передавать функторы по значениюможно пойти в гугл и найти ответы поинтереснее:
http://stackoverflow.com/questions/8196345/passing-functor-o...
http://stackoverflow.com/questions/17626667/why-function-obj...
Я это читал уже. Главный аргумент там, что компилятору так легче оптимизировать код, что кмк не совсем правда. Если функтор stateless, то компилятору никак не помешает то, что он был передан по ссылке. Если нет, то часто state нужен как раз для того, чтобы передать какие-то результаты наружу, т.е. хранит указатель на внешнюю, относительно функции, переменную, и тут передача по значению оптимизации не поможет.
Вот аргумент, про то что при передаче обычной функции по константной ссылке в С++03 происходила ошибка компиляции, имеет право на жизнь.
Вот аргумент, про то что при передаче обычной функции по константной ссылке в С++03 происходила ошибка компиляции, имеет право на жизнь.
Каких-то явных преимуществ ИМХО в этом подходе нет, просто так принято.Вероятно, считают странным передавать по ссылке указатель на функцию.
std::function состоит, в основном, из указателя, тоже быстрая вещь.
И полагают, что кто делает класс с operator и копированием на полчаса, тот сам себе любопытная достопримечательность.
Вот аргумент, про то что при передаче обычной функции по константной ссылке в С++03 происходила ошибка компиляции, имеет право на жизнь.А, ну да, уже сказали.
> Каких-то явных преимуществ ИМХО в этом подходе нет
Конешно есть. Если написать прототипы с передачей по ссылке, то передавать можно будет только по ссылке. А если написать прототипы с передачей по значению, то можно сделать враппер-структурку с полем-ссылкой-на-функтор, и её передача по значению будет работать как передача оригинального функтора по ссылке. В итоге с такими прототипами получаются выразимы обе семантики передачи.
Конешно есть. Если написать прототипы с передачей по ссылке, то передавать можно будет только по ссылке. А если написать прототипы с передачей по значению, то можно сделать враппер-структурку с полем-ссылкой-на-функтор, и её передача по значению будет работать как передача оригинального функтора по ссылке. В итоге с такими прототипами получаются выразимы обе семантики передачи.
А кто мешает в месте вызова создать временный объект-копию и передать ее по ссылке? Ее передача по ссылке будет работать, как передача оригинала по значению.
как вариант, функтор передается по значению для того, чтобы оставить возможность делать ленивые вызовы функтора.
если передавать по ссылке, то ленивые вызовы делать нельзя, потому что функтор уже может быть разрушен.
если передавать по ссылке, то ленивые вызовы делать нельзя, потому что функтор уже может быть разрушен.
А кто мешает в месте вызова создать временный объект-копию и передать ее по ссылке? Ее передача по ссылке будет работать, как передача оригинала по значению.я же написал: время жизни. Если этот функтор захотят сохранить до лучших времен, то возникнут вопросы.
Оставить комментарий
xoki87
почему при передаче функторов другой функции они передаются по значению, а не по ссылке?