C ++ boost date_input_facet parece analisar datas inesperadamente com formatos incorretos passados para o construtor de faceta

Código de brinquedo em coliru que estou usando para testar:http://coliru.stacked-crooked.com/a/4039865d8d4dad52

Estou me acostumando a C ++ novamente depois de um longo hiato. Estou escrevendo um código que analisa um CSV que pode ter várias colunas com datas ou nulos. Suponho que cada coluna de data tenha exatamente um tipo de formato de data válido, embora colunas diferentes possam ter formatos diferentes.

Para cada coluna de data que eu tenho, encontro o primeiro valor que é analisado com êxito como uma data, com base em um vetor std :: de possíveis códigos de idioma com um objeto boost date_input_facet. Essa primeira data que analisa corretamente retornará o índice em minha matriz de localidades que funcionaram. Depois de ter o formato apropriado para a primeira data analisável, quero corrigi-lo para sempre, para não precisar mais perder tempo na CPU detectando o formato.

Aqui está minha variedade de localidades:

const std::vector<std::locale> Date::date_formats = {
    std::locale(std::locale::classic(), new date_input_facet("%Y-%m-%d")),
    std::locale(std::locale::classic(), new date_input_facet("%Y/%m/%d")),
    std::locale(std::locale::classic(), new date_input_facet("%m-%d-%Y")),
    std::locale(std::locale::classic(), new date_input_facet("%m/%d/%Y")),
    std::locale(std::locale::classic(), new date_input_facet("%d-%b-%Y")),
    std::locale(std::locale::classic(), new date_input_facet("%Y%m%d")),
};

Eu uso uma matriz de seqüências de datas de 20170101 a 20170131 para testar isso. Em seguida, imprimo as seqüências de datas originais, a data que foi analisada, juntamente com o índice do vetor date_formats que funcionou para a análise.

Para 20170101 a 201700129, diz que o 0º índice funcionou, que deveria ter o formato "% Y-% m-% d" com os traços?!?! Além disso, para onde vão os traços, eu tenho números, então lê-se 20170101 como 2017-10-, depois solta o último traço e interpreta-o como outubro de 2017, que sem data é 1º de outubro de 2017. Por que faria isso quando não é o formato que deveria usar?

Alguns resultados que se pode ver no meu coliru (pY é analisado ano, etc):

YYYYMMDD    pY     pM   pD  format_index
20170101    2017    Oct 1   0
20170102    2017    Oct 1   0
20170103    2017    Oct 1   0
20170104    2017    Oct 1   0
20170105    2017    Oct 1   0

Para 20170130, 20170131, o índice de formato correto (o quinto) é relatado para "% Y% m% d".

Alguma ideia? Eu só quero que a seqüência de formato exata que eu passei seja usada.

questionAnswers(2)

yourAnswerToTheQuestion