std :: remove_reference有什么意义呢?

Pat*_*oni 3 c++ lambda templates reference c++14

让我深入研究C++ 14泛型lambdas:

#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;
}
Run Code Online (Sandbox Code Playgroud)

因为线// B引起了

从'T'类型的右值开始无效初始化'T&'类型的非const引用

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

调用'incr(T&)'没有匹配函数

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

son*_*yao 9

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

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

value = incr<typename std::remove_reference<decltype(value)>::type>(value);    // A
//           ~~~~~~~~                                       ~~~~~~        
Run Code Online (Sandbox Code Playgroud)

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

value = incr<std::remove_reference_t<decltype(value)>>(value);    // A
//                                ~~ 
Run Code Online (Sandbox Code Playgroud)

生活