簡體   English   中英

C ++如何在rvalue引用上進行模板推導?

[英]How does C++ make template deduction on rvalue reference?

template<typename T>
void foo(T&& arg);

我知道arg是否是左值,例如int x = 0; foo(x); int x = 0; foo(x); 然后T = int& ,函數將是foo(int& &&) ,即foo(int&)

如果arg是一個右值,例如foo(0) ; 然后T = int ,函數將是foo(int&&)

如果我有

template<typename T>
void foo(T& arg);

template<typename U>
void bar(U&& u)
{
    foo(u);
}

在調用bar(0)時, foo中的T是什么?

template<typename U>
void bar(U&& u)
{
    foo(u);
}

不管你傳給bar是什么, u都是左值,因為它有一個名字。

u可能是一個左值引用或右值引用,但是當你將它傳遞給foo ,它的“reference-ness”會被忽略,就像往常一樣。

暫時忘掉左值和右值和模板。 引用應該是另一個變量的別名 ,並且在大多數情況下,引用按名稱引用的行為應該就像引用原始變量一樣:

int i = 42;
int& r = i;

f(int);
f(int&);
f(i); // error: call to ambiguous overload
f(r); // error: call to ambiguous overload

g(int);
g(r); // OK, pass by copy, reference-ness of r is irrelevant

h(int&);
h(i); // OK, pass by reference, non-reference-ness of i is irrelevant

在上面的函數調用語句中, id-expression irint類型的左值。 變量 ir分別是非引用和引用的事實與相應的id表達式的類型或值類別無關。 這是引用始終有效的方式,而右值引用不會改變它。

template<typename T>
void foo(T& arg);

沒有什么可以傳遞給foo會使T成為引用類型。 arg將始終是左值引用。

如果要傳播參數的值類別,則需要std::forward

template<typename U>
void baz(U&& u)
{
    foo(std::forward<U>(u));
}

baz(42); // error: attempted to call foo() with an rvalue

它應該是U最終存在的任何東西,所以如果U是一個int,它就是

bar(int&& u)
{
    foo(u);
}

將int傳遞給foo。

如果我有

template<typename T>
void foo(T& arg);

template<typename U>
void bar(U&& u)
{
    foo(u);
}

在調用bar(0)時,foo中的T是什么?

它可能聽起來有點出乎意料,但是使用rvalue-reference是一個左值表達式,這意味着ufoo(u)是一個左值,並且調用一個帶左值引用的函數是完全正確的(在此案件foo

也就是說,對於調用bar(0) ,使用的專業化將是:

bar<int>(int&&)
foo<int>(int&)

對於int value; bar(value); int value; bar(value); ,專業將是:

bar<int&>(int& &&) // i.e. int&
foo<int>(int&)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM