繁体   English   中英

左值/右值参数的std :: result_of

[英]std::result_of for lvalue/rvalue arguments

我在玩耍时注意到了std::result_of这种行为:

struct Foo {
    int operator()(const int&) const { ... }
    char operator()(int&&) const { ... }
};

result_of_t<Foo(const int&)> a;  // int
result_of_t<Foo(int&&)>      b;  // char
result_of_t<Foo(int)>        c;  // char -- why?

为什么std::result_of在第三种情况下更喜欢采用右值引用的函数?

当给定的非参考参数假定它们是右值时, std::result_of

实际上, std::result_of_t<A(B)>是相同std::result_of_t<A(B&&)>在几乎所有情况下。

如果您想了解原因,则可以在此处看到一些可能的实现 基本上, result_of_t<A(B)>进行decltype( std::declval<A>()(std::declval<B>()) ) (忽略成员函数指针的情况),以及B&& rvalue引用和临时B将调用与A上任何operator()相同的重载。

共有三个主要值类别 (lvalue,prvalue和xvalue)和三个参考限定符 (none, &&& )。

显然, &应该指定左值类别, &&应该指定xvalue有意义。 因此,省略的参考限定符应指定prvalue。

请注意,这与具有相应返回类型的函数所获得的相同:

int f(); // returns prvalue int
int& f(); // returns lvalue reference to int
int&& f(); // returns xvalue reference to int

在您的情况下:

const int& f();
int&& g();
int h();

decltype(Foo{}(f())) a;  // int
decltype(Foo{}(g())) b;  // char
decltype(Foo{}(h())) c;  // char

因此,您可以看到result_of只是显示了decltype会告诉您什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM