Ornicare
Ornicare

Reputation: 53

Selecting which overload is used in c++11

In the following code, as none of the arguments is const, i can't understand why the second overload is called in the 3 following cases.

#include <iostream>
#include <algorithm>

using namespace std;

void ToLower( std::string& ioValue )
{
    std::transform( ioValue.begin(), ioValue.end(), ioValue.begin(), ::tolower );
}

std::string ToLower( const std::string& ioValue )
{
    std::string aValue = ioValue;
    ToLower(aValue);
    return aValue;
}

int main()
{
    string test = "test";
    cout<<"Hello World" << endl;

    // case 1
    cout << ToLower("test") << endl;

    // case 2
    cout << ToLower(static_cast<string>(test)) << endl;

    // case 3
    cout << ToLower(string(test)) << endl;

}

Upvotes: 1

Views: 67

Answers (2)

Hatted Rooster
Hatted Rooster

Reputation: 36463

In all 3 cases you are creating a temporary std::string, this is an unnamed object, an R-value. R-values aren't allowed to bind to non-const l-value references (T&) and so only the overload taking const std::string& ioValue is valid.

Upvotes: 6

Chase R Lewis
Chase R Lewis

Reputation: 2307

The reasoning is the return type is std::string for the second function but void for the first. std::cout << (void) << std::endl is not a valid set of operations. std::cout << (std::string) << std::endl is. If you return a std::string& from the first function you'd probably see #2 & #3 probably use your first function call.

Upvotes: -5

Related Questions