Следующий код работает с gcc
#include <map>
int main() {
std::map<int, double> dict;
const auto lambda = [&]()
{
decltype(dict)::value_type bar;
};
}
Но для msvc Мне нужно дополнительно использовать std::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;
};
}
В противном случае я получаю ошибку:
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
Какой компилятор показывает правильное поведение в соответствии со стандартом?
обновление:
Для msvc decltype(dict)
действительно является ссылкой, так как следующий код
#include <map>
int main()
{
std::map<int, double> dict;
const auto lambda = [&]()
{
decltype(dict) foo;
};
}
ошибки с
error C2530: 'foo': references must be initialized
Если это действительно неправильное поведение, это может привести к неприятным ошибкам, например, обвисшим ссылкам, когда код скомпилирован с 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
};
}