1

我尝试检查T函数do_math()中的模板类是否有可能在复制赋值运算符中引发异常。

但是下面的代码会抛出一个错误:

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>())) )
                                                                                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~^

请帮我写正确的支票。

4

1 回答 1

4

你不需要自己写这个。标准库中已经有一个类型特征:

#include<type_traits>

接着

std::is_nothrow_copy_assignable<T>::value

给你true/false并且可以在说明符中使用noexcept

同样有

std::is_nothrow_copy_constructible<T>::value

检查是否可以进行非抛出复制构造。

但是请注意,如果T不是左值引用类型,那么std::declval<T>是右值,而不是左值。因此,您当前的代码正在测试移动可构造性,而不是复制可构造性。(这些也有类似的类型特征。)

于 2022-01-26T13:48:27.340 回答