在算法内部,我想创建一个通过引用到常量接受元素的 lambda:
template<typename Iterator>
void solve_world_hunger(Iterator it)
{
auto lambda = [](const decltype(*it)& x){
auto y = x; // this should work
x = x; // this should fail
};
}
编译器不喜欢这段代码:
错误:»const«-qualifier 不能应用于 »int&«(手动翻译自德语)
然后我意识到这decltype(*it)
已经是一个参考,当然那些不能做const
。如果我删除const
,代码会编译,但我想x = x
失败。
让我们相信程序员(也就是我)一分钟,摆脱由于引用折叠规则而被丢弃的const
和显式&
,无论如何。但是等等,decltype(*it)
实际上保证是一个参考,或者我应该添加显式&
以确保安全?
如果我们不信任程序员,我可以考虑两种解决方案来解决问题:
(const typename std::remove_reference<decltype(*it)>::type& x)
(const typename std::iterator_traits<Iterator>::value_type& x)
你可以自己决定哪个更丑。理想情况下,我想要一个不涉及任何模板元编程的解决方案,因为我的目标受众以前从未听说过。所以:
问题1:decltype(*it)&
总是和 一样decltype(*it)
?
问题 2:如何在没有模板元编程的情况下通过引用到常量来传递元素?