应用于函数指针的 C++ 右值引用

c++ r-value reference applied to function pointer

#include <iostream>
#include <utility>

template<typename T>
void f1(T&& t) // && 
{

  if constexpr (std::is_function_v<typename std::remove_pointer_t<T>>)
                 std::cout << "function" << std::endl;
  else
    std::cout << "not a function" << std::endl;
}


template<typename T>
void f2(T& t) // & 
{

  if constexpr (std::is_function_v<typename std::remove_pointer_t<T>>)
                 std::cout << "function" << std::endl;
  else
    std::cout << "not a function" << std::endl;
}


void print(){}


int main()
{
    f1(print);
    f2(print);

    return 0;
}

根据 f1,print 不是函数。

根据f2,print是一个函数。

理解为什么会这样有助于理解 && 运算符

在这两种情况下,函数都是通过引用传递的。这两个函数都处理函数 print 的左值引用。

使用

std::is_function_v<std::remove_reference_t<T>>

而不是

std::is_function_v<typename std::remove_pointer_t<T>>

你也可以在两个函数中插入这样的语句

std::cout << std::is_lvalue_reference_v<decltype( t )> << '\n';

确保函数处理对 rpint 的左值引用。

考虑到您需要包含 header <type_traits>

如果您希望函数处理函数指针,那么您需要使用这样的调用

f1(&print);

在这种情况下,第二个函数应该声明为

template<typename T>
void f2( const T& t);

否则您不能将 non-constant 引用绑定到右值。

如果您不想使用限定符 const,也可以调用函数 f2。

auto p = print;

f2(p);