Wewnątrz algorytmu, chcę stworzyć lambda, która akceptuje elementu poprzez odniesienie do const:Przechodząc element z lambda przez reference-to-const
template<typename Iterator>
void solve_world_hunger(Iterator it)
{
auto lambda = [](const decltype(*it)& x){
auto y = x; // this should work
x = x; // this should fail
};
}
Kompilator nie lubi ten kod :
Error: »const«-qualifier cannot be applied to »int&« (translated manually from German)
Wtedy zdałem sobie sprawę, że decltype(*it)
jest już odniesienia, i oczywiście te, które nie mogą być wykonane const
. Jeśli usuniemy const
, kod się skompiluje, ale chcę, aby x = x
się nie powiodło.
Pozwól nam zaufać programistce (która jest mną) przez minutę i pozbyć się const
i jawnej, która zostaje usunięta ze względu na reguły zwijania odniesienia, tak czy inaczej. Ale czekaj, to decltype(*it)
faktycznie gwarantowane być referencją, czy powinienem dodać wyraźne &
, aby być po bezpiecznej stronie?
Jeśli nie ufamy programista, mogę pomyśleć dwa rozwiązania, aby rozwiązać problem:
(const typename std::remove_reference<decltype(*it)>::type& x)
(const typename std::iterator_traits<Iterator>::value_type& x)
Możesz sam zdecydować, który z nich jest brzydsze. Idealnie, chciałbym mieć rozwiązanie, które nie wymaga żadnego meta-programowania szablonów, ponieważ moja grupa docelowa nigdy wcześniej o tym nie słyszała. A więc:
Pytanie 1: Czy decltype(*it)&
jest zawsze takie samo jak decltype(*it)
?
Pytanie 2: Jak mogę przekazać element przez odniesienie do stałej bez meta-programowania szablonów?
Błąd angielski byłby miły! :) – Pubby
@Pubby Próbowałem, co w mojej mocy, nie krępuj się poprawić :) – fredoverflow
@sehe pytanie nie jest o const na najwyższym poziomie. –