Questo codice è un test semplificato per qualcosa che sto cercando di fare altrove. Ho una funzione che accetta un argomento "ref-to-ptr" e lo modifica per restituire un puntatore da un elenco di puntatori.L'assegnazione da un costitutore const_iterator può causare un comportamento non definito?
#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;
}
Funziona e stampe ip = 3
come previsto, solo io sono preoccupato che possa causare un comportamento non definito o comunque portare a problemi, perché sto strappando via la costanza del iteratore assegnando il risultato di esso è dereferenziazione a l'argomento. Ho provato ad aggiungere const
a (1) e (2) ma non è stato creato.
Ho ragione di essere preoccupato? In tal caso, perché non ricevo un avviso da g ++ (4.9.2)?
"Ho provato ad aggiungere const a (1) e (2) ma non ha generato.": Hai fatto anche tu aggiungi 'const' a' intp' typedef? – Petr
No ... Ho trattato il typedef come una stupida macro di sostituzione di una stringa e ho appena inserito il const nella dichiarazione 'func':' void func (const intp & arg) '. A modo tuo, costruisce e funziona, ma non capisco qual è la differenza. – neuviemeporte
'intp' è un puntatore. 'const intp' è un puntatore costante, non dice nulla sulla costanza del valore a cui punta. Quando dici 'typedef const int * intp', dici che punterà a un intero const. – Petr