【问题标题】:How can I say "noexcept if execution of protected base constructor is noexcept"?我怎么能说“如果受保护的基本构造函数的执行是 noexcept,则 noexcept”?
【发布时间】:2016-12-10 20:48:28
【问题描述】:

我们遇到了这种情况,想知道解决它的最佳方法

template<typename T>
struct A : T {
  A(T &&t) noexcept(noexcept(T(std::move(t))))
     :T(std::move(t))
  { }
};

不幸的是,由于 T 的移动构造函数受到保护,因此编译失败,我们只能在 *this 的构造函数初始化列表中调用它。使这项工作的解决方法是什么,或者甚至有标准的方法吗?

【问题讨论】:

  • “我们只能在*this的构造函数初始化列表中调用它”——等等,什么?这是受保护的 constructors 的特殊规则吗?你只能在初始化列表中使用它们?
  • @ecatmur Intel/GCC 失败(可能还有 Clang)。与所有受保护的函数一样,只允许通过 *this 类型的对象或派生类进行调用。
  • @JohannesSchaub-litb 我不明白为什么会这样:Dummy 的构造函数不是有同样的问题吗?谁不需要声明为noexcept?编译器会在这里推断吗?那它为什么不为A推断呢?
  • @KonradRudolph 啊,你是对的,我认为我们确实使用了 Dummy 的隐式生成的移动构造函数。因为它最终也调用了T::T(T&amp;&amp;) 并自动推断出noexceptedness。
  • 好的,看起来意图是让 [class.protected] 应用,但措辞还不完全到位 - CWG1883

标签: c++ c++11 inheritance protected noexcept


【解决方案1】:

您正在寻找noexcept(std::is_nothrow_move_constructible&lt;T&gt;::value)http://en.cppreference.com/w/cpp/types/is_move_constructible

【讨论】:

  • 这似乎不起作用,因为移动构造函数受到保护并且特征无法访问它。
  • @JohannesSchaub-litb 似乎你必须添加是作为基类的朋友。
猜你喜欢
  • 2019-03-07
  • 1970-01-01
  • 2017-06-30
  • 2020-08-27
  • 2020-05-08
  • 2021-04-07
  • 2015-04-24
  • 2019-12-09
  • 2012-03-04
相关资源
最近更新 更多