【发布时间】: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&&)并自动推断出noexceptedness。 -
好的,看起来意图是让 [class.protected] 应用,但措辞还不完全到位 - CWG1883。
标签: c++ c++11 inheritance protected noexcept