[英]How to check copy assignment operator in c++ in noexcept() function
我嘗試檢查 function do_math 中的模板 class T 是否有可能在復制賦值運算符中引發異常。 但是下面的代碼:
template<class T>
void do_math()
noexcept(noexcept(T(std::declval<T>())) && noexcept(std::declval<T>() + std::declval<T>()) && noexcept(std::declval<T>().operator = (std::declval<T>())) )
{
}
引發以下錯誤:
main.cpp:9:135: error: request for member ‘operator=’ in ‘std::declval<int>()’, which is of non-class type ‘int’
noexcept(noexcept(T(std::declval<T>())) && noexcept(std::declval<T>() + std::declval<T>()) && noexcept(std::declval<T>().operator = (std::declval<T>())) )
~~~~~~~~~~~~~~~~~~~~~~~~~~~^
請幫我寫正確的支票。
你不需要自己寫這個。 標准庫中已經有一個類型特征:
#include<type_traits>
接着
std::is_nothrow_copy_assignable<T>::value
給你true
/ false
,可以在noexcept
說明符中使用。
同樣有
std::is_nothrow_copy_constructible<T>::value
檢查是否可以進行非拋出復制構造。
但是請注意,如果T
不是左值引用類型,則std::declval<T>
是右值,而不是左值。 因此,您當前的代碼正在測試移動可構造性,而不是復制可構造性。 (這些也有類似的類型特征。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.