Tôi chơi xung quanh với nhà thầu rõ ràng và hành vi của họ, vì vậy tôi tạo ra lớp này:Tại sao tôi không thể sử dụng constructor rõ ràng cho việc xây dựng một kiểu trả về
#include <iostream>
class X
{
public:
explicit X(void)
{
std::cout << "Default constructor\n";
}
explicit X(X const& x)
{
std::cout << "Copy constructor\n";
}
explicit X(X&& x)
{
std::cout << "Move constructor\n";
}
};
cơ bản mà chỉ là một stub để kiểm tra rõ ràng nhà thầu. Sau đó, tôi muốn thử một số tình huống. Vì vậy, tôi cố gắng này:
X foo(void)
{
X a{};
return a; // ERROR: no matching constructor found!
}
int main()
{
X w{}; // Default Constructor
X x{w}; // Copy Constructor
X y{std::move(x)}; // Move Constructor
X z{foo()};
}
Và như bạn có thể thấy tôi không thể trở về a
bên foo()
. Tôi biết nó cố gắng khởi tạo kiểu trả về Foo
với hàm tạo bản sao, nhưng vì một số lý do nó không thể sử dụng nó.
Làm sao nó không thể sử dụng hàm tạo bản sao được cung cấp của tôi? Tôi biết rằng các đặc điểm kỹ thuật explicit
gây ra vấn đề, bởi vì khi tôi loại bỏ nó từ các nhà xây dựng bản sao nó hoạt động. Nhưng tại sao?
gì confuses me thậm chí nhiều hơn là tôi có thể làm như sau:
void bar(const X& a) { /* */ }
bar(X{});
Nó không phàn nàn. Nhưng không nên bar()
xây dựng thông số của nó a
giống như cách foo()
tạo kiểu trả về của nó?
gọi 'bar' không gọi hàm tạo nào cả, nó chỉ chuyển tham chiếu (con trỏ). bạn sẽ thấy các constructor không copy được gọi. –