如何在不使用 type_traits 的情况下检查复制构造函数是否为 noexcept?
How to check if copy constructor is noexcept without using type_traits?
经过一些试验,我设法编写了一段代码来检查 class 的移动构造函数是否为 noexcept(不使用 type_traits;这只是一个练习):
std::cout << std::boolalpha << noexcept(Widget(std::declval<Widget>())) << std::endl;
declval函数"returns"Widget&&,所以整个表达式是一个移动构造函数调用。但是如何为复制构造函数实现类似的东西?
您可以声明自己的 declval
类函数:
template< class T >
typename std::add_lvalue_reference<T>::type mydeclval() noexcept;
//outputs true if the copy constructor is declared noexcept
std::cout << std::boolalpha << noexcept(Widget(mydeclval<Widget>())) << std::endl;
使用std::declval<Widget&>()
。引用折叠会将 T&& &
变成 T&
:
std::cout << std::boolalpha << noexcept(Widget(std::declval<Widget&>())) << std::endl;
// ^^^^^^^^
经过一些试验,我设法编写了一段代码来检查 class 的移动构造函数是否为 noexcept(不使用 type_traits;这只是一个练习):
std::cout << std::boolalpha << noexcept(Widget(std::declval<Widget>())) << std::endl;
declval函数"returns"Widget&&,所以整个表达式是一个移动构造函数调用。但是如何为复制构造函数实现类似的东西?
您可以声明自己的 declval
类函数:
template< class T >
typename std::add_lvalue_reference<T>::type mydeclval() noexcept;
//outputs true if the copy constructor is declared noexcept
std::cout << std::boolalpha << noexcept(Widget(mydeclval<Widget>())) << std::endl;
使用std::declval<Widget&>()
。引用折叠会将 T&& &
变成 T&
:
std::cout << std::boolalpha << noexcept(Widget(std::declval<Widget&>())) << std::endl;
// ^^^^^^^^