C++11, wywołanie g++ z parametrem -Wextra w wyrażeniu lambda
Ostatnio zmodyfikowano 2014-08-01 16:29
Maciek Temat założony przez niniejszego użytkownika |
C++11, wywołanie g++ z parametrem -Wextra w wyrażeniu lambda » 2014-07-29 22:28:28 Witam. Napotkałem ciekawą zagadkę, mianowicie kompilowanie kodu : #include <algorithm> #include <vector>
int main() { std::vector < std::vector < int *> > vec( 3, std::vector < int *>( 3 ) ); std::for_each( vec.begin(), vec.end(),[]( std::vector < int *>& ref ) { std::for_each( ref.begin(), ref.end(),[]( int * ptr ) { ptr = new int( rand() % 256 ); } ); } ); }
za pomocą g++ z parametrem -Wextra (pomijam inne flagi) Daje ostrzeżenie : ../main.cpp: In lambda function: ../main.cpp:15:52: warning: parameter ‘ptr’ set but not used [-Wunused-but-set-parameter] std::for_each(ref.begin(), ref.end(), [](int* ptr){ ^
Mam pytanie - czy owe ostrzeżenie jest słuszne ? Z komunikatu kompilatora rozumiem że wyrażenie lambda jest traktowane jak odrębna funkcja ( jeśli tak, to słuszne ostrzeżenie :) ), nie wiem tylko czy jest na to paragraf w standardzie ? Bardzo dziękuję za sprostowanie. PS. Dodam tylko, że clang nie daje warningu, mimo tego że "podobno" jest w 100% zgodny ze standardem. |
|
pekfos |
» 2014-07-29 22:50:18 Nie zagadka, tylko błędny kod. Modyfikujesz kopię wskaźnika. Dodam tylko, że clang nie daje warningu, mimo tego że "podobno" jest w 100% zgodny ze standardem. |
No i co? To tak nie działa. |
|
Maciek Temat założony przez niniejszego użytkownika |
» 2014-08-01 12:02:32 Czyli nie mogę napisać takiej zagnieżdżonej pętli za pomocą wyrażeń lambda ? Zawsze pracuje się na kopii ? |
|
Monika90 |
» 2014-08-01 13:37:44 Możesz - wystarczy użyć referencji, ale możesz też użyć algorytmu std::generate |
|
Maciek Temat założony przez niniejszego użytkownika |
» 2014-08-01 16:13:51 Oczywiście rozumiem, z referencją działa, natomiast problemem jest to, co w sytuacji, jeśli parametrem szablonu jest wskaźnik, tak jak w tym prostym przykładzie. Czy lambda może operować na "surowych" wskaźnikach czy muszę skorzystać z iteratora (a właściwie czy powinienem) ? |
|
Monika90 |
» 2014-08-01 16:22:19 no to użyj referencji do wskaźnika: int *& ptr |
|
Maciek Temat założony przez niniejszego użytkownika |
» 2014-08-01 16:29:10 O sprytne, dzięki za pomoc. |
|
« 1 » |