const decltype(* std :: begin(container))& val不会使val const?

时间:2011-11-17 12:07:40

标签: c++ visual-c++ lambda const c++11

这段代码:

std::vector <int> ints(5,1);
std::for_each(ints.begin(), ints.end(), [](const decltype(*std::begin(ints))& val){ val*=2; });

在Visual Studio 2010中编译并运行得很好,并修改容器中的每个值,就好像const关键字不存在一样。这是编译器中的错误,因为预期的行为是val是不可修改的吗? (换句话说,我希望它不会编译,但确实如此)

更新

std::for_each(ints.begin(), ints.end(), [](const std::remove_reference<decltype(*std::begin(ints))>::type& val){ val*=2; });

似乎表现得很正常,但这并不能让我更聪明。

注意:

decltype(*std::begin(ints))是对int的引用。

1 个答案:

答案 0 :(得分:8)

似乎编译器试图将const应用于int&,使其成为int& const,这是多余的,因为无论如何都无法重置 1)。尝试将const放在decltype和引用之间:decltype(*ints.begin()) const&

1)感谢您对澄清的评论。

报废,感谢@ Ben的评论,我注意到了真正的问题。试试decltype(*ints.cbegin())cbegin返回const_iterator,它取消引用为const的引用。此外,由于*ints.cbegin()已经返回int const&,因此无需额外的&符号。

为了解释OP代码中的错误,正如@Ben Voigt在评论中所说的那样:decltype(*std::begin(ints))解析为int&,因为std::begin(ints)返回非const迭代器非const容器和解除引用这样的迭代器返回一个引用到非const。