Я ищу унарный функтор, который разыменует его аргумент и возвращает результат. Конечно, я могу написать один, просто казалось, что что-то уже должно существовать.
Итак, учитывая код:
const auto vals = { 0, 1, 2, 3 };
vector<const int*> test(size(vals), nullptr);
iota(begin(test), end(test), data(vals));
transform(cbegin(test), cend(test), ostream_iterator<int>(cout, " "), [](const auto& i){ return *i; });
Я надеялся, что есть функтор, который я мог бы использовать вместо лямбды. Существует ли такая вещь, или мне нужно просто использовать лямбду?
Предполагая, что «функтор» ты имеешь в виду «функциональный объект» или же «вызываемый объект», в стандартной библиотеке, кажется, нет того, чего вы хотите.
Это легко реализовать самостоятельно:
struct deferencer
{
template <typename T>
decltype(auto) operator()(T&& x) const
noexcept(noexcept(*x))
{
return *x;
}
};
Обратите внимание, что ваша лямбда не делает то, что вы ожидаете, так как ее неявный тип возврата -> auto
, который делает копию. Одним из возможных правильных лямбда является:
[](const auto& i) -> decltype(auto) { return *i; }
Если вы не укажете явное конечный тип возврата для лямбды неявный будет auto
который всегда копия. Не имеет значения, если operator*
возвращает ссылку, так как лямбда возвращает копию (т.е. ссылка, возвращенная operator*
затем копируется лямбда return
заявление).
struct A
{
A() = default;
A(const A&) { puts("copy ctor\n"); }
};
int main()
{
[]{ return *(new A); }(); // prints "copy ctor"}
Других решений пока нет …