我知道标记为的构造函数将尽可能=default
“尝试” noexcept
。但是,如果我在类之外定义它,它就不再是noexcept
了,正如您从这段代码中看到的那样:
#include <iostream>
#include <utility>
#include <type_traits>
struct Bar
{
Bar() = default;
Bar(Bar&&) = default; // noexcept
};
struct Foo
{
Foo() = default;
Foo(Foo&&);
};
// moving the definition outside makes it noexcept(false)
Foo::Foo(Foo&&) = default; // not noexcept anymore
int main()
{
Foo foo;
Bar bar;
std::cout << std::boolalpha;
// checks
std::cout << std::is_nothrow_move_constructible<Bar>::value << std::endl;
std::cout << std::is_nothrow_move_constructible<Foo>::value << std::endl;
}
如何=default
在类之外定义这样的构造函数并制作它noexcept
?如果在类之外定义,为什么会有这样的构造函数noexcept(false)
?通过智能指针实现PIMPL时会出现此问题。