我有以下代碼:與詮釋與論證通過INT &&函數初始化
#include <type_traits>
struct TType
{
int a = 0;
bool operator() (int&)
{
return true;
}
};
int main()
{
static_assert(std::is_same<decltype(std::declval<TType>()(std::declval<int>())), bool>::value, "wtf?");
return 0;
}
如果我嘗試使用g編譯它++ - 4.8.2然後我收到一個錯誤:
main.cpp:321:82: error: no match for call to ‘(JetPlane) (int)’
static_assert(std::is_same<decltype(std::declval<JetPlane>()(std::declval<int>())), bool>::value, "wtf?");
^
main.cpp:265:8: note: candidate is:
struct JetPlane
^
main.cpp:279:7: note: bool JetPlane::operator()(int&)
bool operator() (int&)
^
main.cpp:279:7: note: no known conversion for argument 1 from ‘int’ to ‘int&’
我不瞭解note: no known conversion for argument 1 from ‘int’ to ‘int&’
一行。所以,問題是:爲什麼G ++解釋返回std::declval<int>()
型像int
,雖然標準:: declval聲明看起來不就行了int&&
:
template< class T >
typename std::add_rvalue_reference<T>::type declval();
據我所知,我們會禁止綁定int&&
到int
。但爲什麼然後編譯器不打印:note: no known conversion for argument 1 from ‘int’ to ‘int&’
行。可能是我不明白的東西和編譯器的變化莫名其妙地返回std::declval<int>()
的類型從int&&
int
在std::declval<TType>()(std::declval<int>())
?
謝謝你的幫忙!
'int &&'無法綁定到'int&'。 – Simple
是的,我明白這一點。但是,爲什麼那麼編譯器不打印:沒有已知的轉換從參數1「詮釋&&」到「廉政和」 – rbtrht
我想這是由於遺留原因。這是類型'int'的右值,這對年齡意味着類型'int',所以這是錯誤的報告。是的,你的情況是類型INT''&&,但是這仍然是一個'int'右值。 – Angew