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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top