首页 > 解决方案 > std::remove_reference 有什么意义

问题描述

让我深入了解 C++14 通用 lambda:

#include <iostream>

// g++ -std=c++14 

template<typename T>
T incr(T v)
{
    return v + 1;
}


int main()
{
    float f = 2.0;
    int i = 3;

    auto selfincr = [] (auto & value)
        {
            value = incr<std::remove_reference<decltype(value)>>(value);    // A
            value = incr<decltype(value)>(value);                           // B
        };


    selfincr(f);
    selfincr(i);

    std::cout << "f " << f << ", i " << i << std::endl;
    return 0;
}

由于线// B导致

从“T”类型的右值初始化“T&”类型的非常量引用无效</p>

我的直接猜测是删除了引用,所以我添加了 line // A。但这会产生一个

'incr(T&)'的调用没有匹配的函数</p>

那么我怎么能删除那个引用呢?

标签: c++templateslambdareferencec++14

解决方案


那么我怎么能删除那个引用呢?

incr<std::remove_reference<decltype(value)>>(value),您指定为模板参数,而不是(ie )std::remove_reference<T>引用的类型。你想要的应该是Tdecltype(value)

value = incr<typename std::remove_reference<decltype(value)>::type>(value);    // A
//           ~~~~~~~~                                       ~~~~~~        

从 C++14 开始,你可以让它更简单:

value = incr<std::remove_reference_t<decltype(value)>>(value);    // A
//                                ~~ 

居住


推荐阅读