Il C ++ fornisce una garanzia per la durata di una variabile temporanea creata all'interno di una chiamata di funzione ma non utilizzata come parametro? Ecco un esempio di classe:
class StringBuffer
{
public:
StringBuffer(std::string & str) : m_str(str)
{
m_buffer.push_back(0);
}
~StringBuffer()
{
m_str = &m_buffer[0];
}
char * Size(int maxlength)
{
m_buffer.resize(maxlength + 1, 0);
return &m_buffer[0];
}
private:
std::string & m_str;
std::vector<char> m_buffer;
};
Ed ecco come lo useresti:
// this is from a crusty old API that can't be changed
void GetString(char * str, int maxlength);
std::string mystring;
GetString(StringBuffer(mystring).Size(MAXLEN), MAXLEN);
Quando verrà chiamato il distruttore per l'oggetto StringBuffer temporaneo? È:
- Prima della chiamata a GetString?
- Dopo che GetString è tornato?
- Dipendente dal compilatore?
So che il C ++ garantisce che una variabile temporanea locale sarà valida fintanto che c'è un riferimento ad essa: questo si applica agli oggetti padre quando c'è un riferimento a una variabile membro?
Grazie.
m_str.reserve(maxlength)in char * Size(int maxlength), in caso contrario il distruttore potrebbe gettare.