c++ - 按值传递认为参数是const

标签 c++ visual-c++ c++11 lambda boost-variant

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

此处开始相关代码。这些位在 header 中定义。

//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 的参数列表有关。 swap 被调用,我认为在对的复制构造函数中,试图首先从传递给 lambda 的右值分配给参数。当在 std::pair 复制构造函数中分配给它时,编译器认为“value.first”是常量。但显然,参数不是 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 派生类。没有成员,没有方法,什么都没有。这足以在我的复制构造函数中导致此错误。我无法想象还有什么方法可以隔离 ACTUALLY 有问题的代码行......

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

最佳答案

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

关于c++ - 按值传递认为参数是const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11675366/

相关文章:

c++ - 有没有办法全局填充新/删除分配?

c++ - 如何doxygen注释Qt属性?

c++ - 迈耶斯单例 : static keyword confusion

c++ - 我正在尝试在函数中使用新内存新堆内存,但它给出了一个错误

c++ - 允许对具有相同底层结构的类型进行隐式转换

c++ - 自定义分配器兼容性

c++ - quickfix c++ 配置文件中的 SocketUseSSL 属性

c++ - 适用于集合的 std::async 变体

c++ - Cmake 找不到 Boost 文件夹

visual-c++ - 如何关闭 MSVC 中的异常处理?