【发布时间】:2024-01-19 08:25:01
【问题描述】:
这段代码:
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 的引用。
【问题讨论】:
-
gcc 只是拒绝编译:
error: ‘const’ qualifiers cannot be applied to ‘int&’. -
它拒绝编译两个版本?
-
当然,第二个不会编译,因为
val是一个常数,不能是*= 2-ed。 -
啊,是的,愚蠢的我 =) 这就是它应该做的,但第一个在 gcc 中也不能编译?
-
@BenVoigt:是的,如果通过
typedef或模板参数 (§8.3.2/1) 引入引用,则会忽略const。decltype不是其中之一。
标签: c++ visual-c++ lambda constants c++11