¿C ++ proporciona una garantía durante la vida útil de una variable temporal que se crea dentro de una llamada de función pero no se usa como parámetro? Aquí hay una clase de ejemplo:
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 así es como lo usaría:
// 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 se llamará al destructor del objeto StringBuffer temporal? Lo es:
- ¿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 los objetos principales cuando hay una referencia a una variable miembro?
Gracias.
m_str.reserve(maxlength)en char * Size(int maxlength)caso contrario, el destructor podría lanzar.