2009-08-21 16 views
9

Trabajando en la pregunta this, encontré un comportamiento incoherente.const referencia vinculante a un rvalue

¿Por qué el enlace de referencia se comporta de forma diferente en un constructor desde una función común?

struct A { 
}; 

struct B : public A { 
    B(){} 
private: 
    B(const B&); 
}; 

void f(const B& b) {} 

int main() { 
    A a(B()); // works 
    A const & a2 = B(); // C++0x: works, C++03: fails 
    f(B()); // C++0x: works, C++03: fails 
} 

he probado para C++ 03 con g ++ - 4,1 y Comeau 4.2.45.2 en estricta modo C++ 03 y con C++ 0x extensiones deshabilitadas. Obtuve los mismos resultados.

Para C++ 0x se probó con g ++ - 4.4 y Comeau 4.3.9 en modo relajado y con extensiones C++ 0x habilitadas. Obtuve los mismos resultados.

Respuesta

16
A a(B()); 

es la declaración de una función llamada una devolución de un A y teniendo un puntero a una función sin argumentos devolver un B. Ver here. agregar un paréntesis y obtendrá el error que espera:

A a((B())); 
+7

famoso conocido como "el análisis sintáctico más irritante". – earl

+0

No puedo esperar el día en que pueda decirle a alguien "fuiste víctima del problema de análisis más molesto". Por supuesto, cuando eso suceda me olvidaré por completo y volveré a odiar a C++. –

Cuestiones relacionadas