¿C++ proporciona una garantía de por vida de una variable temporal que se crea dentro de una llamada a función pero no se utiliza como parámetro? He aquí un ejemplo de clase:Vida útil garantizada temporal en C++?
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;
};
Y aquí es cómo se usa:
// 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);
¿Cuándo el destructor del objeto temporal StringBuffer ser llamado? Es esto:
- ¿Antes de la llamada a GetString?
- ¿Después de que GetString regrese?
- ¿Depende del compilador?
Sé que C++ garantiza que una variable temporal local será válida siempre que haya una referencia a ella: ¿esto se aplica a objetos padre cuando hay una referencia a una variable miembro?
Gracias.
¿por qué no heredar y sobrecargar o hacer una función global? Estaría más limpio y no tendrías que crear una clase para llamar a un miembro. –
Si va a usar esto, debe llamar a 'm_str.reserve (maxlength)' en 'char * Size (int maxlength)', de lo contrario el destructor podría lanzar. – Mankarse