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

按值、左值引用和右值引用传递函数名会发生什么?

如何解决按值、左值引用和右值引用传递函数名会发生什么?

我不确定在各种情况下右值和左值的确切机制。 举个例子吧。

#include <iostream>

void f() { std::cout << "Hello\n"; }

template<typename T>
void g0(T&& a) {
    a();
}

template<typename T>
void g1(T& a) {
    a();
}

template<typename T>
void g2(T a) {
    a();
}

int main() {

    printf("%p,%p\n",f,&f); // f and &f are same

    g0(f); // (1)
    g0(&f); // (2)

    g1(f); // (3)
//    g1(&f); // (4) compile error !!

    g2(f); // (5)
    g2(&f); // (6)
}

我的问题

  1. f(=> &f) 之前的函数名 f 和 & 都只是函数指针。我说得对吗?
  2. 当我将函数名或带有函数名的 & 传递给各种函数的参数时会发生什么?
  3. (4) 有编译错误。 f 和 &f 在我的理解下是一样的,但为什么会发生? 我知道如果我使用诸如“void g1(const T& a)”之类的 const 可以编译它,但我不确定为什么。

错误信息是:

candidate function [with T = void (*)()] not viable: no kNown conversion from 'void (*)()' to 'void (*&)()' for 1st argument
void g1(T& a)...

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