tipo de objeto capturado por referência dentro do lambda

O código a seguir funciona comgcc

#include <map>

int main() {
    std::map<int, double> dict;
    const auto lambda = [&]()
    {
        decltype(dict)::value_type bar;
    };
}

Mas pelomsvc Eu tenho que usar adicionalmentestd::remove_reference

#include <map>
#include <type_traits>

int main() {
    std::map<int, double> dict;
    const auto lambda = [&]()
    {
        std::remove_reference_t<decltype(dict)>::value_type bar;
    };
}

Caso contrário, eu receboum erro:

error C2651: 'std::map<int,double,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>> &': left of '::' must be a class, struct or union

Qual compilador mostra o comportamento correto de acordo com o padrão?

atualizar:

Paramsvc decltype(dict) é realmente uma referência, como o código a seguir

#include <map>

int main()
{
    std::map<int, double> dict;
    const auto lambda = [&]()
    {
        decltype(dict) foo;
    };
}

erros com

error C2530: 'foo': references must be initialized

Se esse comportamento for realmente errado, pode levar aerros desagradáveis, como referências pendentes quando o código é compilado com o msvc.

#include <map>

std::map<int, double> return_a_map()
{
    std::map<int, double> result;
    return result;
}

int main()
{
    std::map<int, double> dict;
    const auto lambda = [&]()
    {
        decltype(dict) foo = return_a_map();
        // foo is a dangling reference in msvc
    };
}

questionAnswers(1)

yourAnswerToTheQuestion