Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C++11, wywołanie g++ z parametrem -Wextra w wyrażeniu lambda

Ostatnio zmodyfikowano 2014-08-01 16:29
Autor Wiadomość
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 :

C/C++
#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.
P-114639
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.
P-114640
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 ?
P-114832
Monika90
» 2014-08-01 13:37:44
Możesz - wystarczy użyć referencji, ale możesz też użyć algorytmu std::generate
P-114847
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) ?
P-114868
Monika90
» 2014-08-01 16:22:19
no to użyj referencji do wskaźnika:
int *& ptr
P-114869
Maciek
Temat założony przez niniejszego użytkownika
» 2014-08-01 16:29:10
O sprytne, dzięki za pomoc.
P-114870
« 1 »
  Strona 1 z 1