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 派生类。没有成员,没有方法,什么都没有。这足以在我的复制构造函数中导致此错误。我无法想象如何隔离实际上有问题的代码行......
有没有人认为这是编译器打嗝,并且一些未提及的更改会产生副作用?