#include <iostream>
using namespace std;
namespace mine {
template <typename T>
struct remove_rval {
using type = T;
};
template <typename T>
struct remove_rval<T&&> {
using type = T;
};
template <typename T>
void g(const T& = typename remove_rval<T>::type())
cout << __PRETTY_FUNCTION__ << endl;
}
}
int main()
{
mine::g<int&&>(); // doesn't work, because of explicit template?
const int& i2 = mine::remove_rval<int&&>::type(); // works, sanity check
return 0;
}
我寫的函式模板編譯失敗。根據我對 c 的理解,您可以將右值分配給常量左值參考。但是,在這種情況下,就像推導型別在分配函式默認值時忽略了“const”限定符。為什么是這樣?
uj5u.com熱心網友回復:
從dcl.ref/p6:
如果typedef-name ([dcl.typedef], [temp.param]) 或decltype-specifier ([dcl.type.decltype]) 表示型別 TR 是對型別 T 的參考,則嘗試創建對 cv
TR的型別左值參考創建對 的型別左值參考T,而嘗試創建對 cv TR 的型別右值參考會創建型別TR。
因此,在您的示例中,whenT = int&& :
根據上面參考的陳述句const T&折疊為T&(which is int&) 而不是 const T&(which is )。const int&而且由于我們無法將右值remove_rval<T>::type()系結到非常量左值參考,因此您會收到上述錯誤。
因此,即使函式引數in的形式g是對constT又名const左值參考(即const T&,范圍:g g TT&int&
template<>
void g<int &&>(int&)
{
//operator<< called here
}
而且由于引數是,int&我們不能將右值remove_rval<int&&>::type()系結到該引數。
uj5u.com熱心網友回復:
void g(const T& = typename remove_rval<T>::type())
參考折疊規則const T&等于U&when T = U&&。左值參考不能系結到像remove_rval<T>::type(). 您可以改為簡單地int作為模板引數傳遞,引數的型別將正確地為const int&.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/432108.html
上一篇:條件遞增不正確
下一篇:在哪里使用右值作為函式引數?
