【问题标题】:How to check if copy constructor is noexcept without using type_traits?如何在不使用 type_traits 的情况下检查复制构造函数是否为 noexcept?
【发布时间】:2015-04-09 15:27:09
【问题描述】:

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

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

declval 函数“返回”Widget&&,因此整个表达式是一个移动构造函数调用。但是如何为复制构造函数实现类似的东西呢?

【问题讨论】:

  • 你可以*static_cast&lt;Widget&gt;(nullptr)

标签: c++ typetraits


【解决方案1】:

使用std::declval&lt;Widget&amp;&gt;()。引用折叠会将T&amp;&amp; &amp; 变成T&amp;

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

【讨论】:

  • 无论如何,我想知道如何为复制 = 运算符编写类似的检查? :)
  • @BarbedWire noexcept(declval&lt;Widget&amp;&gt;() = declval&lt;Widget const&amp;&gt;())
【解决方案2】:

您可以声明自己的declval-like 函数:

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;

【讨论】:

  • 哦,我一直在做几乎相同的事情,但忘记将 noexcept 添加到 mydeclval 本身并想知道为什么它不起作用:D 谢谢!
  • Waaaaait 等一下……但原始的 declval 并未声明为 noexcept!那么为什么它适用于我的代码呢?
  • @rubix_addict 声明为 noexcept:en.cppreference.com/w/cpp/utility/declval
  • 哦,你是对的。对不起。我很快查看了 cppreference 上的 declval 签名,并没有意识到文本中还有“noexcept 规范”。
猜你喜欢
  • 1970-01-01
  • 2016-06-17
  • 1970-01-01
  • 2016-08-10
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
相关资源
最近更新 更多