Có bao giờ có ý nghĩa khi có một hàm tạo di chuyển constexpr
?Có một constructor constexpr di chuyển không?
Ví dụ, hãy xem xét những điều sau đây:
#include <array>
class C
{
public:
constexpr C(std::array<int, 3> ar) : m_ar{ar} {}
constexpr C(C&& other) : m_ar{std::move(other.m_ar)} { }
private:
std::array<int, 3> m_ar;
};
int main()
{
constexpr C c1 {{{1, 2, 3}}};
constexpr C c2{std::move(c1)};
return 0;
}
này không biên dịch, vì mặc dù gọi std::move
trên c1
, trình biên dịch deduces nó cần phải sử dụng các nhà xây dựng (ngầm xóa) sao chép, không phải là nhà xây dựng di chuyển . Tôi cung không chăc tại sao.
Nhưng nếu tôi xóa constexpr
từ c1
thì nó sẽ không thể sử dụng được bởi hàm tạo di chuyển constexpr
.
Có cách nào để làm việc này không? Hay đây là một ví dụ xấu cho một hàm tạo di chuyển constexpr
, nhưng có những ví dụ hay? Hoặc, nó chỉ luôn luôn sai khi có một constructor di chuyển constexpr
?
Với 'constexpr C (const C && other)', nó biên dịch từ C++ 14. – Jarod42
@ Jarod42 Nhưng nó có khả năng không thực sự di chuyển bất cứ điều gì, vì bạn không thể di chuyển từ một đối tượng const. Nó trở thành một hàm tạo bản sao phức tạp không cần thiết. –
@ Jarod42 Huh. Nó có. Làm thế nào mà? Tôi mong đợi 'std :: move (other.m_ar)' thất bại vì 'other' là' const C && '(vì nó biên dịch, tôi mong đợi nó * làm * di chuyển' khác.m_ar', trừ khi nó làm một cái gì đó lén lút thay vì như sao chép 'other.m_ar' thay thế). – Danra