697. New <system_error> header leads to name clashes

Section: 22.5 [syserr] Status: Resolved Submitter: Daniel Krügler Opened: 2007-06-24 Last modified: 2016-02-10

Priority: Not Prioritized

View all other issues in [syserr].

View all issues with Resolved status.

Discussion:

The most recent state of N2241 as well as the current draft N2284 (section 22.5 [syserr], p.2) proposes a new enumeration type posix_errno immediatly in the namespace std. One of the enumerators has the name invalid_argument, or fully qualified: std::invalid_argument. This name clashes with the exception type std::invalid_argument, see 22.2 [std.exceptions]/p.3. This clash makes e.g. the following snippet invalid:

#include <system_error>
#include <stdexcept>

void foo() { throw std::invalid_argument("Don't call us - we call you!"); }

I propose that this enumeration type (and probably the remaining parts of <system_error> as well) should be moved into one additional inner namespace, e.g. sys or system to reduce foreseeable future clashes due to the great number of members that std::posix_errno already contains (Btw.: Why has the already proposed std::sys sub-namespace from N2066 been rejected?). A further clash candidate seems to be std::protocol_error (a reasonable name for an exception related to a std network library, I guess).

Another possible resolution would rely on the proposed strongly typed enums, as described in N2213. But maybe the forbidden implicit conversion to integral types would make these enumerators less attractive in this special case?

Proposed resolution:

Fixed by issue 7 of N2422.