c++ - funciones - expresiones rdlc
¿Un error de VS2010? Permitir el enlace de referencia no const a rvalue SIN INCLUIR una advertencia? (3)
El compilador emitirá un error con Desactivar extensiones de idioma activadas, y una advertencia en / W4. Sin embargo, eliminar este código romperá el código de compilación anterior, y Microsoft es muy reacio a hacerlo. Esta es también la razón por la que no repararán su soporte de SFINAE.
string foo() { return "hello"; }
int main()
{
//below should be illegal for binding a non-const (lvalue) reference to a rvalue
string& tem = foo();
//below should be the correct one as only const reference can be bind to rvalue(most important const)
const string& constTem = foo();
}
- GCC es el mejor para dar un error de compilación : inicialización no válida de referencia no const de tipo
std::string&
de un temporal de tipostd::string
- VS2008 no es tan malo como al menos da una advertencia de compilación : advertencia C4239: extensión no estándar utilizada: ''inicialización'': conversión de
std::string
astd::string &
Una referencia no const solo puede estar vinculada a un valor l - Aquí viene la problemática: VS2010 (SP1) compila bien SIN ningún error o advertencia, ¿POR QUÉ? Sé que la referencia de valor en VS2010 se puede usar para vincular con rvalue, pero NO estoy usando
&&
; en cambio, en el código de demostración, ¡solo estaba usando una referencia de valor l no const!
¿Puede alguien ayudarme a explicar el comportamiento de VS2010 aquí? Es un error !? Gracias
Ese es un problema / característica conocida de los compiladores VS. Siempre lo han permitido y no parece haber ningún impulso para eliminar esa extensión .
Hay una variante mucho más desagradable de este problema:
class Foo {
int _val;
public:
Foo(int v) : _val(v) {}
void F() { std::cout << _val << std::endl; }
};
class Bar {
Foo& f;
public:
Bar(Foo& f) : f(f) {}
void F() { f.F(); }
};
int main() {
Bar b(Foo(3));
b.F();
}
Entonces: ¿a qué punto bf
durante la llamada a bF()
? El ejemplo anterior, compilado con la configuración de depuración predeterminada de VS2013, se ejecuta sin fallar e imprime 3
, pero sospecho que cualquier ejemplo mucho más complejo dará lugar a la corrupción de la pila. Si no es así y el compilador está haciendo algo ''inteligente'' para que funcione, entonces supongo que lo que realmente está haciendo es esto:
class Foo {
int _val;
public:
Foo(int v) : _val(v) {}
void F() { std::cout << _val << std::endl; }
};
class Bar {
Foo f;
public:
Bar(Foo&& f) : f(f) {}
void F() { f.F(); }
};
int main() {
Bar b(Foo(3));
b.F();
}