Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does a quoted string match bool method signature before a std::string?

Given the following methods:

// Method 1
void add(const std::string& header, bool replace);

//Method 2
void add(const std::string& name, const std::string& value);

It would appear that the following code will end up calling method 1 instead of method 2:

something.add("Hello", "World");

I ended up creating another method that looks like this:

//Method 3
void MyClass::add(const char* name, const char* value) {
    add(std::string(name), std::string(value));
}

It worked. So it would seem that when a method accepts a "quoted string" it will match in the following order:

  1. const char*
  2. bool
  3. std::string

Why would a quoted string be treated as a bool before a std::string? Is this the usual behavior? I have written a decent amount of code for this project and haven't had any other issues with the wrong method signature being selected...

like image 813
Beau Simensen Avatar asked Jul 19 '09 02:07

Beau Simensen


2 Answers

My guess is the conversion from pointer to bool is an implicit primitive type conversion, where the conversion to std::string requires the call of a constructor and the construction of a temporary.

like image 61
Sam Harwell Avatar answered Sep 22 '22 22:09

Sam Harwell


In your case you have has overloaded functions. Overloading resolution occurs according to Section 13.3.

C++03 13.3.3.2/2:

When comparing the basic forms of implicit conversion sequences (as defined in 13.3.3.1)
— a standard conversion sequence (13.3.3.1.1) is a better conversion sequence than a user-defined conversion sequence or an ellipsis conversion sequence, and
— a user-defined conversion sequence (13.3.3.1.2) is a better conversion sequence than an ellipsis conversion sequence (13.3.3.1.3).

Conversion pointer into bool is a standard conversion. Conversion pointer into std::string is a user-defined conversion.

4.12 Boolean conversions An rvalue of arithmetic, enumeration, pointer, or pointer to member type can be converted to an rvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false; any other value is converted to true.

like image 21
Kirill V. Lyadvinsky Avatar answered Sep 23 '22 22:09

Kirill V. Lyadvinsky