當模板參數T
是基本類型(如int
(在gcc 4.8上))時,以下代碼無法編譯。這是標準符合行爲嗎?我對std::declval
的理解是,它總是解析爲T&&
或T&
。在基本類型上使用std :: declval
template <class T>
void foo(T&& val)
{
std::cout << noexcept(std::declval<typename std::decay<T>::type>() = val);
}
struct bar { };
bar b;
foo(b); // okay
int a;
foo(a); // error: using xvalue (rvalue reference) as lvalue
錯誤發生在分配val
到std::declval
表達的點。
它工作,如果我刪除std::decay
和直接使用std::declval<T>
,但我不知道爲什麼。腐朽型應該只是int
,所以std::declval<int>()
應該有一個返回類型int&&
不應該嗎?
看來你試圖複製'std :: is_nothrow_copy_assignable'函數? – kennytm
差不多。如果'T'是一個左值引用,我想檢查是否有複製賦值,但是如果'T'是一個右值引用,我想檢查是否移動賦值。 – marack