6

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

4

2 に答える 2

4

これができることに気づきましたが、今まで頭に浮かびませんでした:

struct Foo
{
    Foo() = default;
    Foo(Foo&&) noexcept;
};
Foo::Foo(Foo&&) noexcept = default; // now it is noexcept

それでも 2 番目の質問は、なぜnoexcept(false)デフォルトになっているのですか? 適用されます。

于 2015-04-24T15:06:14.440 に答える