簡體   English   中英

如何在 noexcept() function 中檢查 c++ 中的復制賦值運算符

[英]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.

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