としてマークされたコンストラクターは、可能な限り=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を実装するときに発生します。