C++ 通过引用const将元素传递给lambda

C++ 通过引用const将元素传递给lambda,c++,c++11,template-meta-programming,lambda,decltype,C++,C++11,Template Meta Programming,Lambda,Decltype,在算法内部,我想创建一个lambda,它通过引用const来接受元素: 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 };

在算法内部,我想创建一个lambda,它通过引用const来接受元素:

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
    };
}
你可以自己决定哪一个更丑。理想情况下,我想要一个不涉及任何模板元编程的解决方案,因为我的目标受众以前从未听说过。因此:

问题1:
decltype(*it)&
是否总是与
decltype(*it)
相同


问题2:在没有模板元编程的情况下,如何通过引用const传递元素?

问题1:否,对InputIterator的要求仅仅是它可以转换为T(表72,在“迭代器要求”中)

因此,
decltype(*it)
对于
value\u type
int
的迭代器,例如可以是
const char&
。或者它可以是
int
。或
double

使用
iterator\u traits
并不等同于使用
decltype
,请决定要使用哪种类型

出于同样的原因,
autovalue=*it不一定给您一个迭代器值类型的变量

问题2:可能取决于模板元编程的含义

如果使用traits类型是TMP,那么在没有TMP的情况下无法指定“对迭代器的值类型的常量引用”,因为
iterator\u traits
是访问任意迭代器的值类型的唯一方法

如果您想构造
decltype
,那么这个如何

template<typename Iterator>
void solve_world_hunger(Iterator it)
{
    const auto ret_type = *it;
    auto lambda = [](decltype(ret_type)& x){
        auto y = x;   // this should work
        x = x;        // this should fail
    };
}
模板
void解决世界饥饿(迭代器it)
{
const auto ret_type=*it;
自动lambda=[](decltype(ret_type)&x){
自动y=x;//这应该可以工作
x=x;//这应该失败
};
}
您可能必须捕获
ret_type
才能使用它的类型,我目前无法轻松检查


不幸的是,它额外取消了迭代器的引用。您可能会编写一些聪明的代码来避免这种情况,但聪明的代码最终会成为
remove\u reference
的替代版本,因此TMP。

一个英文错误就好了!:)@Pubby我已经尽力了,请随意更正:)@sehe这个问题不是关于顶级常量的。@Bцццћ不是很明显吗?这个函数应该是用来解决世界饥饿问题的,但它并没有履行它的契约。@KonradRudolph:如果这个该死的东西被编译了,那么它可能会,格式错误的程序的含义是实现定义的;-)好的,我会咬紧牙关,然后解释一下迭代器的特性。@fredwolflow:写一本书/教程?不。如果我写了一本书,我肯定休息室会第一个知道;)
template<typename Iterator>
void solve_world_hunger(Iterator it)
{
    const auto ret_type = *it;
    auto lambda = [](decltype(ret_type)& x){
        auto y = x;   // this should work
        x = x;        // this should fail
    };
}