я играл вокруг с явными конструкторами и их поведением, так что я создал этот класс:Почему я не могу использовать явный конструктор для построения возвращаемого типа
#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";
}
};
который в основном только заглушки для того чтобы испытать явные конструкторы. Тогда я хотел попробовать несколько ситуаций. Так что я попытался это:
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()};
}
И как вы можете видеть, что я не могу вернуться a
внутри foo()
. Я знаю, что он пытается инициализировать возвращаемый тип Foo
с помощью конструктора копирования, но по какой-то причине он не может его использовать.
Почему он не может использовать предоставленный мной конструктор копирования? Я знаю, что спецификация explicit
вызывает проблему, потому что когда я удаляю ее из конструктора копирования, она работает. Но почему?
Что меня смущает еще то, что я могу сделать следующее:
void bar(const X& a) { /* */ }
bar(X{});
Он не жалуется. Но не должно bar()
построить его параметр a
таким же образом foo()
строит свой тип возврата?
вызов 'bar' вообще не вызывает конструктор, он просто передает ссылку (указатель). вы должны увидеть, что вызовы no copy не вызываются. –