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

为什么 std::forward 将我的左值变成右值?

如何解决为什么 std::forward 将我的左值变成右值?

template<class T>
struct IntHolder {
    T i;
};

template<class T>
void addOne(T& t) {
    t.i += 1;
}

template<class... Args>
void addAll(Args... args) {
      // Magic to run addOne on each arg
      int dummy[] = { 0,((void)addOne(std::forward<Args>(args)),0)... };
}

int main() {
    IntHolder<int> x{2};
    IntHolder<double> t{3};
    addAll(x,t);
    return 0;
}

这个玩具示例无法编译,因为

prog.cc: In instantiation of 'void addAll(Args ...) [with Args = {IntHolder<int>,IntHolder<double>}]':
prog.cc:60:16:   required from here
prog.cc:54:39: error: invalid initialization of non-const reference of type 'IntHolder<int>&' from an rvalue of type 'IntHolder<int>'
       int dummy[] = { 0,0)... };
                                       ^
prog.cc:48:6: note:   initializing argument 1 of 'void addOne(T&) [with T = IntHolder<int>]'
 void addOne(T& t) {

我认为这里会发生的是 addAll 传入两个左值,然后 addOne 将作为左值在每个左值上调用。但是,似乎在此过程中的某个地方,编译器认为参数正在转换为右值。为什么会这样?

解决方法

您将参数声明为非引用,即按值传递,然后在传递 xt 时,类型将推导出为 IntHolder<int> 和 {{ 1}}。然后 IntHolder<double> 会将它们转换为右值。

对于 forwarding reference 应该是

std::forward<Args>

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