Con std::optional, ¿qué significa “eliminar el constructor de movimientos de la resolución de sobrecarga”?
Estoy creando una implementación de std::optional
en C++14. Sin embargo, estoy un poco confundido con respecto a cómo se especifica el constructor de movimiento. Esto es a lo que me refiero (énfasis mío):
La expresión dentro de
noexcept
es equivalente ais_nothrow_move_constructible_v<T>
.
Este constructor no deberá participar en la resolución de sobrecarga a menos queis_move_constructible_v<T>
seatrue
. Siis_trivially_move_constructible_v<T>
estrue
, este constructor deberá ser un constructor constexpr.
¿Qué significa quitar el constructor de movimiento de la resolución de sobrecarga? La eliminación y SFINAE no parecen funcionar para este escenario.
davy.ai
Cuando se elimina un constructor de la resolución de sobrecarga, significa que el constructor no se considera como candidato viable para la construcción, incluso si su firma coincide con los tipos de argumentos dados. En este caso, si
is_move_constructible_v <t>
es falso, el constructor de movimiento no se considerará como una opción válida para construir el objeto. Esto generalmente se hace para evitar comportamientos indeseables, como el corte, la copia o la construcción por defecto de objetos no deseados.La eliminación y SFINAE se pueden usar para eliminar un constructor basado en traits de tipo. Sin embargo, en este escenario, el requisito no es eliminar el constructor, sino eliminarlo de la consideración durante la resolución de sobrecarga. Esto se logra mediante una afirmación estática en combinación con
std :: enable_if
ystd :: is_move_constructible
. Elenable_if
asegura que el constructor solo esté disponible cuandois_move_constructible_v <t>
es verdadero, mientras que la afirmación estática genera un error de tiempo de compilación si la condición no se cumple.