簡體   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