受保护的 noexcept 构造函数似乎不是来自派生 class 的 noexcept。为什么?
Protected noexcept constructor doesn't seem noexcept from derived class. Why?
这是来源:
#include <type_traits>
#include <utility>
class A {
protected:
//public: // if public, it's fine. (?)
A()noexcept{}
A(A&&) noexcept{}
};
class B : public A {
static_assert(std::is_nothrow_constructible<A>::value,"err1"); // ! err1
static_assert(std::is_nothrow_move_constructible<A>::value,"err2"); // ! err2
public:
B()noexcept(std::is_nothrow_constructible<A>::value):A(){}
B(B&& o)noexcept(std::is_nothrow_move_constructible<A>::value):A(std::move(o)){}
};
int main(){
static_assert(std::is_nothrow_constructible<B>::value,"err3"); // ! err3
static_assert(std::is_nothrow_move_constructible<B>::value,"err4"); // ! err4
return 0;
}
编译失败,错误 1、错误 2、错误 3 和错误 4。
但是,如果我将 public 设为 class A 的构造函数,它就可以工作。
为什么?
(Clang 6.0,7.0; gcc 8.x; ...)
std::is_nothrow_constructible
和 std::is_nothrow_move_constructible
检查表达式是否
T obj(std::declval<Args>()...);
格式正确。由于它在 class 的上下文之外进行此检查,因此考虑了成员访问。由于您的构造函数受到保护,因此表达式不合法且特征 return false.
这是来源:
#include <type_traits>
#include <utility>
class A {
protected:
//public: // if public, it's fine. (?)
A()noexcept{}
A(A&&) noexcept{}
};
class B : public A {
static_assert(std::is_nothrow_constructible<A>::value,"err1"); // ! err1
static_assert(std::is_nothrow_move_constructible<A>::value,"err2"); // ! err2
public:
B()noexcept(std::is_nothrow_constructible<A>::value):A(){}
B(B&& o)noexcept(std::is_nothrow_move_constructible<A>::value):A(std::move(o)){}
};
int main(){
static_assert(std::is_nothrow_constructible<B>::value,"err3"); // ! err3
static_assert(std::is_nothrow_move_constructible<B>::value,"err4"); // ! err4
return 0;
}
编译失败,错误 1、错误 2、错误 3 和错误 4。 但是,如果我将 public 设为 class A 的构造函数,它就可以工作。 为什么?
(Clang 6.0,7.0; gcc 8.x; ...)
std::is_nothrow_constructible
和 std::is_nothrow_move_constructible
检查表达式是否
T obj(std::declval<Args>()...);
格式正确。由于它在 class 的上下文之外进行此检查,因此考虑了成员访问。由于您的构造函数受到保护,因此表达式不合法且特征 return false.