Tôi biết rằng một hàm tạo được đánh dấu là =default
sẽ "thử" là noexcept
bất cứ khi nào có thể. Tuy nhiên, nếu tôi định nghĩa nó ngoài lớp, nó không phải là noexcept
nữa, như bạn có thể nhìn thấy từ mã này:Cách tạo hàm tạo mặc định được định nghĩa bên ngoài lớp 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;
}
Làm thế nào tôi có thể định nghĩa như một constructor =default
bên ngoài một lớp và làm cho nó noexcept
? Và tại sao một nhà xây dựng như vậy là noexcept(false)
nếu được định nghĩa bên ngoài lớp học? Vấn đề này phát sinh khi triển khai PIMPL thông qua con trỏ thông minh.
Cụ thể, nếu nó được mặc định sau khai báo ban đầu, mặc định có thể xảy ra trong một TU khác, vì vậy trong một TU chỉ chứa định nghĩa lớp, trình biên dịch không có cách nào biết rằng hàm sẽ được mặc định. –
@ T.C. điều này làm cho cảm giác hoàn hảo, tôi hiểu bây giờ. – vsoftco