应用于函数指针的 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);
#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);