【问题标题】:c++ r-value reference applied to function pointerc++ r值引用应用于函数指针
【发布时间】:2020-06-07 12:07:05
【问题描述】:
#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是一个函数。

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

【问题讨论】:

  • 函数参数中的&amp;&amp;&amp; 运算符是 逻辑AND - 它们分别是引用运算符和r-value reference operator
  • @AdrianMole 他们根本不是操作员。
  • @HolyBlackCat 公平点。编辑我的评论为时已晚,但我认为我提供的链接应该是(新的)欺骗目标。
  • @Vince 检查this。要了解为什么在第一种情况下T 会变成void (&amp;)(),请阅读转发引用T&amp;&amp; 是其中之一)。

标签: c++ pass-by-reference function-pointers rvalue


【解决方案1】:

在这两种情况下,函数都是通过引用传递的。这两个函数都处理对函数 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 的左值引用。

考虑到您需要包含标题&lt;type_traits&gt;

如果你想让函数处理函数指针,那么你需要使用这样的调用

f1(&print);

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

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

否则,您可能无法将非常量引用绑定到右值。

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

auto p = print;

f2(p);

【讨论】:

  • 只是为了确保,在他的示例中,函数指针 print 被视为右值,不是吗?
  • @Afshin 没有函数指针。这两个模板函数都通过引用接受其参数打印。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 2021-09-08
  • 2017-05-30
  • 1970-01-01
相关资源
最近更新 更多