Passar por valor pensa que o parâmetro é const
-
12-12-2019 - |
Pergunta
Visual Studio Enterprise 2010, sp1, no Windows 7 de 64 bits.Aumente 1.48.0.
Aqui começa o código relevante.Esses bits são definidos em um cabeçalho.
//typedef struct {} empty_t;
//typedef std::pair<size_t, std::shared_ptr<char>> string_t; //Don't ask...
//typedef boost::variant<empty_t, long, double, some other PODs, string_t> variant_t;
//typedef std::map<unsigned short, variant_t> variant_map_t;
e isso está no corpo de um construtor de cópia:
std::for_each(std::begin(incoming.values_), std::end(incoming.values_), [&](variant_map_t::value_type value)
{
// This guy is going to populate this::values_, doing the right thing -
// copying by value native and POD types, or deep copying pointers.
boost::apply_visitor(deep_copy_visitor(*this, value.first), value.second);
});
O erro que estou encontrando é na lista de parâmetros do lambda.swap está sendo chamado, acho que no construtor de cópia do par, tentando atribuir primeiro do rvalue passado ao lambda ao parâmetro.O compilador pensa que "value.first" é const quando está sendo atribuído no construtor de cópia std::pair.Mas claramente, o parâmetro não é qualificado como const, o mapped_type ou key_type não é qualificado como const, o construtor de cópia não é um método const e NADA DISSO DEVE IMPORTAR DE QUALQUER FORMA.
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\utility(209) : see reference to function template instantiation 'void std::_Swap_adl<_Ty1>(_Ty &,_Ty &)' being compiled
with
[
_Ty1=unsigned short,
_Ty=unsigned short
]
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\utility(206) : while compiling class template member function 'void std::pair<_Ty1,_Ty2>::swap(std::pair<_Ty1,_Ty2> &)'
with
[
_Ty1=const unsigned short,
_Ty2=variant_t
]
src\foo.cpp(506) : see reference to class template instantiation 'std::pair<_Ty1,_Ty2>' being compiled
with
[
_Ty1=const unsigned short,
_Ty2=variant_t
]
Então, de alguma forma, o parâmetro do modelo está sendo qualificado como const e, durante toda a minha vida, não consigo entender o porquê.
Acho que outra coisa está atrapalhando o compilador, mas não tenho mais nada para fazer.Anteriormente, antes de dar uma boa mexida em meu código-fonte, tentando descobrir isso, eu poderia ativar e desativar essa mensagem de erro;Eu defini uma classe derivada boost::static_visitor.Nenhum membro, nenhum método, nada.Isso foi o suficiente para causar este erro no meu construtor de cópia aqui.Não consigo imaginar de que outra forma isolar o que é NA VERDADE a linha de código ofensiva ...
Alguém acha que isso é um problema do compilador e que alguma mudança não mencionada tem isso como efeito colateral?
Solução
O value_type
de std::map<K, V>
é std::pair<K const, V>
, porque as chaves são imutáveis.Então sim, value.first
é const-qualificado.