gpt4 book ai didi

c++ - std::is_pointer 检查通用引用

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:59:44 24 4
gpt4 key购买 nike

我编写了一个函数来检查给定变量是否为指针类型:

template<typename T>
void CheckIfPointer(T&& value)
{
static_assert(std::is_pointer<typename std::remove_reference<T>::type>::value, "T must be of pointer type");
}

我在这里使用通用引用,因为我不想限制可以传入的值类别。但是我注意到,在这个例子中:

char const* mystr = "Hello World";
CheckIfPointer(mystr);

Type T 实际上是 const char *& (根据 clang)。那么 remove_reference 是合适的解决方案吗?或者是否有一种更简洁的方法来检查实际类型,而不会妨碍引用?

请注意,我最多只支持 C++14。

最佳答案

Type T is actually const char *& (according to clang).

在模板参数推导中有一个特殊规则被引入以允许完美转发。在模板参数推导的上下文中,T&& 不是右值引用,而是转发引用

如果一个左值被传递给一个采用转发引用的函数模板,类型参数被推断为T&而不是 T。这允许发生引用折叠:T& && 变成T&

来自 cppreference :

If P is an rvalue reference to a cv-unqualified template parameter (so-called forwarding reference), and the corresponding function call argument is an lvalue, the type lvalue reference to A is used in place of A for deduction (Note: this is the basis for the action of std::forward Note: in class template argument deduction, template parameter of a class template is never a forwarding reference (since C++17))

template<class T>
int f(T&&); // P is an rvalue reference to cv-unqualified T (forwarding reference)
template<class T>
int g(const T&&); // P is an rvalue reference to cv-qualified T (not special)

int main()
{
int i;
int n1 = f(i); // argument is lvalue: calls f<int&>(int&) (special case)
int n2 = f(0); // argument is not lvalue: calls f<int>(int&&)

// int n3 = g(i); // error: deduces to g<int>(const int&&), which
// cannot bind an rvalue reference to an lvalue
}

So is the remove_reference the appropriate solution here? Or is there a cleaner way of checking the actual type, without references getting in the way?

是的,remove_reference 在这里很合适。您可能希望使用 std::remove_reference_t 来避免显式的 typename::type


此外,为什么要通过转发引用 来传递指针?您确定不想通过通过左值引用 传递吗?

考虑使用 const T& 代替:

template<typename T>
void CheckIfPointer(const T& value)
{
static_assert(std::is_pointer<T>::value, "T must be of pointer type");
}

关于c++ - std::is_pointer 检查通用引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46850769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com