std::is_function
专门针对具有类似签名的类型:
int(int) &
请参阅此处:std :: is_function
但这既不是成员方法的指针,哪种签名可能是:
int(T::*)(int) &
也不是对函数的引用:
int (&)(int)
那么这个奇怪的签名是什么?
这是一种功能类型,仅存在于类型系统中。它永远无法创建。
但这既不是成员方法的指针,哪种签名可能是:
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 的将来版本可能是正确的。
在您链接到的文档页面上,您会看到此评论:
// specialization for function types that have ref-qualifiers
列表上方您引用的示例来自。
这些是带有ref-Qualifier的函数,您可以在此处阅读更多有关这些功能。
简而言之,它们类似于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;
}
我想不出这个功能的绝佳用例,但是可以使用。
由于时间的开始(参考第一个C 标准(,您可以将这种"奇怪"函数类型声明为,例如
typedef int F() const;
尽管上述声明并未立即涉及任何类,但在这种情况下,尾随的const
只能作为非静态类成员函数的构造资格。这限制了上述类型名称对班级成员声明的使用。例如,可以按以下方式使用它
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
限定符。