int(int)& 或 int(int) const &是什么类型?



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限定符。

最新更新