如何在不使用type_traits的情况下检查复制构造函数是否为noexcept?

时间:2015-04-09 15:27:10

标签: c++ typetraits

经过一些实验,我设法编写了一段代码来检查类的移动构造函数是否为noexcept(不使用type_traits;这只是一个练习):

std::cout << std::boolalpha << noexcept(Widget(std::declval<Widget>())) << std::endl;

declval函数&#34;返回&#34; Widget&amp;&amp;,所以整个表达式是一个移动构造函数调用。但是如何为复制构造函数实现类似的东西?

2 个答案:

答案 0 :(得分:7)

使用std::declval<Widget&>()。引用折叠会将T&& &变为T&

std::cout << std::boolalpha << noexcept(Widget(std::declval<Widget&>())) << std::endl;
//                                                          ^^^^^^^^

答案 1 :(得分:2)

您可以声明自己的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;