std::is_function
专门用于具有类似于:
int(int) &
见这里:std::is_function
但这既不是指向成员方法的指针,也可能是:
int(T::*)(int) &
它也不是对函数的引用:
int (&)(int)
那么这个奇怪的签名是什么?
答案 0 :(得分:13)
它是一种仅存在于类型系统中的函数类型。它永远不会被创造。
但这既不是指向成员方法的指针,也可能是:
int(T::*)(int) &
这是没有指针的。类型系统允许您将其描述为类型。
#include <type_traits>
struct T { };
using A = int(int) &;
using B = A T::*;
using C = int(T::*)(int) &;
static_assert(std::is_same_v<B, C>);
@ T.C。提到PR0172R0,讨论了这些类型的存在如何给图书馆作者带来问题,并提出了几个可能减少这些问题的方案。其中一个选择是完全摆脱它们,其他选择减少它们的影响。根据具体情况,对于C ++的未来版本,这个答案可能正确也可能不正确。
答案 1 :(得分:6)
在您链接的文档页面上,您会看到以下评论:
// specialization for function types that have ref-qualifiers
在列表上方,您引用的示例来自。
这些是具有引用限定符的函数,您可以阅读更多关于here的内容。
简而言之,它们与const
限定函数类似。这是一个例子:
struct foo
{
void bar() & { std::cout << "this is an lvalue instance of foo" << "\n"; }
void bar() && { std::cout << "this is an rvalue instance of foo" << "\n"; }
};
int main(int argc, char* argv[])
{
foo f{};
f.bar(); // prints "this is an lvalue instance of foo"
std::move(f).bar(); // prints "this is an rvalue instance of foo"
return 0;
}
我无法想到这个功能的一个很好的用例,但它可以使用。
答案 2 :(得分:5)
从一开始(指第一个C ++标准)你可以声明这样的“奇怪”函数类型,例如
typedef int F() const;
尽管上述声明不会立即涉及任何类,但在这种情况下,尾随const
只能作为非静态类成员函数的const限定。这限制了上述typedef-name对类成员声明的使用。例如,可以按如下方式使用它
struct S {
F foo; // Declares an `int S::foo() const` member function
};
int S::foo() const { // Defines it
return 42;
}
F S::*p = &S::foo; // Declares 'p' as `int (S::*)() const` pointer
请注意,无论多么模糊,这都是一种“经典”C ++功能,该功能已经使用了很长时间。
您的示例中的内容实际上是相同的,但使用C ++ 11 ref-qualifier代替const
限定符。