微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – std :: remove_reference有什么意义

让我潜入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;
}

因为//行引起了一个

invalid initialization of non-const reference of type ‘T&’ from an rvalue of type ‘T’

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

no matching function for call to ‘incr(T&)’

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

解决方法

So how Could I remove that reference ?

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

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

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

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

LIVE

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐