1

Visual Studio Enterprise 2010,sp1,在 Windows 7 64 位上。提升 1.48.0。

这里开始相关代码。这些位在标头中定义。

//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;

这是在复制构造函数的主体中:

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);
});

我发现的错误与 lambda 的参数列表有关。正在调用交换,我认为在该对的复制构造函数中,尝试首先从传递给 lambda 的右值分配给参数。当在 std::pair 复制构造函数中分配“value.first”时,编译器认为它是 const。但很明显,参数不是 const 限定的,mapped_type 或 key_type 不是 const 限定的,复制构造函数不是 const 方法,无论如何都不应该重要。

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
          ]

所以不知何故,模板参数得到了 const 限定,对于我的生活,我无法弄清楚为什么。

我认为其他东西正在使编译器绊倒,但我没有其他东西可以解决。早些时候,在我给我的源代码好好搅动之前,试图弄清楚这一点,我可以打开和关闭这个错误消息;我已经定义了一个 boost::static_visitor 派生类。没有成员,没有方法,什么都没有。这足以在我的复制构造函数中导致此错误。我无法想象如何隔离实际上问题的代码行......

有没有人认为这是编译器打嗝,并且一些未提及的更改会产生副作用?

4

1 回答 1

6

value_typeofstd::map<K, V>std::pair<K const, V>,因为键是不可变的。所以,是的,value.first是 const 限定的。

于 2012-07-26T18:12:06.640 回答