Dieser Code ist ein vereinfachter Test für etwas, das ich woanders versuchen möchte. Ich habe eine Funktion, die ein "ref-to-ptr" -Argument nimmt und es ändert, um einen Zeiger von einer Liste von Zeigern zurückzugeben.Kann die Zuweisung von einer Dereferenzierung const_iterator zu undefiniertem Verhalten führen?
#include <iostream>
#include <list>
using namespace std;
typedef int* intp;
typedef std::list<intp> intplist;
intplist myList;
void func(intp &arg) // (1)
{
intplist::const_iterator it = myList.begin();
std::advance(it, 2);
arg = *it;
}
int main()
{
myList.push_back(new int(1));
myList.push_back(new int(2));
myList.push_back(new int(3));
int* ip = NULL; // (2)
func(ip);
if (ip) cout << "ip = " << *ip << endl;
else cout << "ip is null!" << endl;
for (intplist::const_iterator it = myList.begin(); it != myList.end(); ++it)
delete *it;
return 0;
}
Es funktioniert und druckt ip = 3
wie erwartet, nur ich bin besorgt, dass es nicht definiertes Verhalten verursachen kann oder sonst zu Problemen führen, weil ich die Konstantheit des Iterator am Abstreifen durch die Zuordnung des Ergebnis es dereferencing zu das Argument. Ich habe versucht, const
bei (1) und (2) hinzuzufügen, aber es hat nicht gebaut.
Bin ich richtig besorgt zu sein? Wenn ja, warum bekomme ich keine Warnung von g ++ (4.9.2)?
"Ich habe versucht, const bei (1) und (2) hinzuzufügen, aber es hat nicht gebaut.": Haben Sie auch füge 'const' zu' intp' typedef hinzu? – Petr
Nein ... Ich behandelte das Typedef als ein dummes String-Ersetzungs-Makro und setzte das const einfach in die 'func'-Deklaration: 'void func (const intp & arg)'. Dein Weg, es baut und funktioniert, aber ich verstehe nicht, was der Unterschied ist. – neuviemeporte
'intp' ist ein Zeiger. 'const intp' ist ein konstanter Zeiger, er sagt nichts über die Konstanz des Wertes aus, auf den er zeigt. Wenn Sie 'typedef const int * intp' sagen, sagen Sie, dass es auf eine const Ganzzahl zeigt. – Petr