overload vs default parameters in c++ standard

2019-04-05 03:51发布

问题:

I was reading another question, and it got me thinking. Often the standard specifies functions which have default parameters in their descriptions. Does the standard allow writing these as overloads instead?

For example, the standard says that std::basic_string::copy has the following declaration:

size_type copy(Ch* p, size_type n, size_type pos = 0) const;

Could a conforming implementation of the standard library implement this instead as two functions like this?

size_type copy(Ch* p, size_type n, size_type pos) const;
size_type copy(Ch* p, size_type n) const;

In this example, the second version could skip the if(pos > size()) { throw out_of_range(); } test that is necessary in the first one. A micro-optimization, but still you see the point of the example.

回答1:

Could a conforming implementation of the standard library implement this instead as two functions like this?

Yes. The C++ Standard (C++03 17.4.4.4/2-3) says:

An implementation can declare additional non-virtual member function signatures within a [Standard Library] class:

-- by adding arguments with default values to a member function signature; the same latitude does not extend to the implementation of virtual or global or non-member functions, however.

-- by replacing a member function signature with default values by two or more member function signatures with equivalent behavior;

-- by adding a member function signature for a member function name.

A call to a member function signature described in the C + + Standard library behaves the same as if the implementation declares no additional member function signatures