"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué `std :: vector :: reference` devuelve un` bool & `?

¿Por qué `std :: vector :: reference` devuelve un` bool & `?

Publicado el 2025-03-11
Navegar:803

Why Doesn't `std::vector::reference` Return a `bool&`?

por qué vector :: referencia no devuelve la referencia a bool?

en c, el contenedor std :: vector está especializado para valores booleanos. Esta especialización introduce diferencias en el comportamiento en comparación con los vectores de otros tipos de datos.

el problema

En el ejemplo proporcionado, una función Calliftoggled se usa para alternar un valor de bool y llamar a un método en una estructura. Al intentar pasar una referencia a un elemento de un std :: vector a Calliftoggled, se produce un error de compilación. Esto se debe a que el tipo de referencia devuelto por Vector :: Reference no es el bool esperado &.

la razón

dentro de la especialización de vector bool, vector :: La referencia devuelve una referencia a un char, no un bool. Esto se hace para optimizar el rendimiento utilizando una representación bitwise para valores booleanos.

solucions

[&]
  • use vector en su lugar: reemplazar el vector bool con un vector para trabajar alrededor del problema de especialización. Biblioteca: La biblioteca de contenedores Boost proporciona una versión no especializada de Vector que ofrece una referencia verdadera a los valores de Bool.
  • Wrap Bool Valores en una estructura: Crear una estructura de envoltura alrededor de Bool llamada MyBool. Esto permite pasar una referencia al contenedor, que a su vez proporciona acceso indirecto al valor de bool subyacente.
  • ejemplo (vector de char):

#incluir estructurar { void foo () {} }; plantilla Void Calliftoggled (Char V1, Char & V2, T&T) { if (v1! = v2) { v2 = v1; t.foo (); } } int main () { std :: vector v = {false, true, false}; const char f = falso; A a; Calliftoggled (F, V [0], a); Calliftoggled (F, V [1], a); Calliftoggled (F, V [2], a); }

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3