Vik*_*ehr 4 c++ lambda const visual-c++ c++11
这段代码:
std::vector <int> ints(5,1);
std::for_each(ints.begin(), ints.end(), [](const decltype(*std::begin(ints))& val){ val*=2; });
Run Code Online (Sandbox Code Playgroud)
在Visual Studio 2010中编译并运行得很好,并修改容器中的每个值,就好像const关键字不存在一样.这是编译器中的错误,因为预期的行为是val是不可修改的吗?(换句话说,我希望它不会编译,但确实如此)
更新:
std::for_each(ints.begin(), ints.end(), [](const std::remove_reference<decltype(*std::begin(ints))>::type& val){ val*=2; });
Run Code Online (Sandbox Code Playgroud)
似乎行为正常,但这并不能让我更聪明.
注意:
decltype(*std::begin(ints))
是对int的引用.
这似乎编译器将尝试应用const
到int&
,使得它int& const
,这是多余的,因为引用无法反正重新插拔1) .尝试将const放在decltype
和引用之间:decltype(*ints.begin()) const&
1)感谢您对澄清的评论.
废话,感谢@ Ben的评论,我注意到了真正的问题.试试decltype(*ints.cbegin())
.cbegin
返回a const_iterator
,它解引用引用到const.此外,不需要额外的&符号,因为*ints.cbegin()
已经返回了int const&
.
为了解释OP代码中出了什么问题,正如@Ben Voigt在评论中所说:decltype(*std::begin(ints))
解析为int&
,因为std::begin(ints)
返回非const容器的非const迭代器并且解除引用这样的迭代器会返回对非const的引用.
归档时间: |
|
查看次数: |
515 次 |
最近记录: |