2012-07-07 16 views
5

se explica mejor con un ejemplo:la asignación de una temperatura a un miembro de ref const provoca un fallo de segmentación

tok.h

#include <string> 

static const char* defaultDelim = ".,;"; 

class Tokenizer { 
public: 
    Tokenizer(): 
     // 'delim' is the const ref member that is initialized by the temp string 
     delim((altDelim.size())? altDelim : std::string(defaultDelim)) 
    {} 

    size_t scan(const std::string& str) 
    { return str.find_first_of(delim); } 

    static void setDelim(const std::string& d) { altDelim = d; } 
private: 
    static std::string altDelim; 
    const std::string& delim; 
}; 

main.cpp

#include <iostream> 
using namespace std; 

#include "tok.h" 

std::string Tokenizer::altDelim; 

int main() 
{ 
    Tokenizer tok; 

    size_t pos = tok.scan("hello, world"); 
    cout << pos << endl; 
} 

la el programa imprime 0 que es incorrecto. El código real obtiene un fallo seg.

Espero que la regla de prolongar la vida útil de una temperatura asignada a una referencia constante se mantenga aquí, pero aparentemente no lo es. Sabe usted la razón'?

Respuesta

4

Esa regla no se aplica a los miembros de la clase. Esto se afirma en 12.2.5 de la norma C++ 03:

A temporary bound to a reference member in a constructor's ctor-initializer 
persists until the constructor exits. 

Hacer el último temporal más largo que el que implicaría que el temporal tendría que ser mantenido como parte de la clase para que su vida útil podría ser mantenido. Esto sería imposible si el constructor estaba en una unidad de compilación separada, porque el tamaño de la clase debe conocerse cuando se define la clase.

// header file 
struct A { 
    A(); 
    B &b; 
}; 


// file1.cpp 
void f() 
{ 
    A a; // Reserve the size of a single reference on the stack. 
} 


// file2.cpp 
A::A() 
: b(B()) // b is referencing a temporary, but where do we keep it? 
     // can't keep the temporary on the stack because the 
     // constructor will return and pop everything off the stack. 
     // Can't keep it in the class because we've already said the 
     // class just contains a single reference. 
{ 
} 
+0

De vez en cuando, no veo por qué no hubo votos alternos para esto. Lento día hoy. :( –

+0

concisa y completa. ¡Muchas gracias! – davka

Cuestiones relacionadas