Pregunta Constructores explícitos por defecto en C ++ 17


En C ++ 17, los tipos de etiquetas vacías en la biblioteca estándar ahora tienen constructores predeterminados que están marcados explicity también = default. Por ejemplo, std::piecewise_construct_t ahora se define como

struct piecewise_construct_t { explicit piecewise_construct_t() = default; };

Mi pregunta es simple, ¿cuál es el motivo de este cambio de C ++ 14? ¿Qué significa un constructor predeterminado explícitamente predeterminado (!) Para una clase vacía?

(Para evitar ser marcado como un embaucador: esta pregunta desde 2010 pregunta sobre el propósito de los constructores explícitos por defecto, pero eso fue anterior a C ++ 11 y hace mucho tiempo, así que es probable que las cosas hayan cambiado. Esta pregunta es más reciente, pero la respuesta parece sugerir que la inicialización agregada se realizará independientemente de la presencia del constructor en incumplimiento, por lo que tengo curiosidad sobre el motivo de este cambio en el último estándar).


15
2018-05-24 23:48


origen


Respuestas:


La razón para el cambio de la biblioteca está en LWG 2510 "Los tipos de etiqueta no deben ser DefaultConstructible":

std::experimental::optional, por ciertas razones, especifica su nullopt escriba para no ser DefaultConstructible. No lo hace para su tipo de etiqueta in_place_t y tampoco lo hace el estándar apropiado para ninguno de sus tipos de etiquetas. Eso resulta ser muy desafortunado, considere lo siguiente:

#include <memory>
#include <array>

void f(std::array<int, 1>, int) {} // #1
void f(std::allocator_arg_t, int) {} // #2

int main()
{
  f({}, 666); // #3
}

La llamada en el n. ° 3 es ambigua. Lo que es aún peor es que si se elimina la sobrecarga n. ° 1, la llamada funciona bien. El objetivo de un tipo de etiqueta es que sea necesario mencionarlo en una llamada o debe ser un argumento reenviado, por lo que no se puede construir un tipo de etiqueta como ese.

La cuestión de LWG evolucionó lado a lado con CWG 1518 "Constructores predeterminados explícitos e inicialización de listas de copia", que tiene antecedentes útiles.


15
2018-05-25 00:03