I believe you're not looking for an answer like "C++ standard says it doesn't, so it doesn't." because you wouldn't have asked the question in the first place.
Assume we have a class MyClass.
In fact, when you do this: MyClass my_obj = MyClass();
It works. No compiler error is generated. No runtime error.
That brings us to the question: so constructors have return type?
In my opinion, yes, so no.
When a constructor returns a known type at all times, then there is no need for the programmer to specify the return type anymore. Effectively, we don't have a return type for constructors.
If we are a bit philosophical, then we find the world is like this. Politicians claim they will strive to make a world where everyone is happy. Then, everyone is not happy because everyone is happy.
Constructors do not return anything. The expression SomeContainer.push_back(MyClass()); is not calling the constructor directly - MyClass() is a nameless object that is constructed with the default constructor, note my phrasing "is" an object and not "returns" an object.
Constructors can not be static because they rely on the this pointer.
Constructors can not be const because they change the state of the object to construct it.
Constructors can not be virtual because you can not construct an object without knowing its type.
They have no name and are therefore not found with name lookups. They are called with explicit type conversion using the functional notation.
Edit: I'm fairly sure they are not functions...looking for the reference...
Edit: Hmmm 'Special member function' maybe that was what I remember.
Edit: Re: this pointer...(brain fart, I avoid explicit this use in constructors)
thanks all for your input - things are a bit clear to me now. I guess I should start reading Bjarne Stroustroupe C++ Programming Language book to get more insights into C++.
Constructors can not be const because they change the state of the object to construct it.
Actually, the constructor is called as usual when creating a const object instance. Constructors are allowed to touch const objects because they need to set the initial state.
Constructors can not be static because they rely on the this pointer.
Wrong. Constructors are not class members, so the "static" concept (in the meaning of static method or static field) doesn't apply to them. They are neither static nor non-static. From the user perspective they behave exactly like a static method (you can't call a constructor on an existing object), and therefore they cannot be also virtual, internally they have access to the newly created this poiter, so they have access privileges like a non-static member.