Meehatpa
Meehatpa

Reputation: 349

Type id of std::string for variable vs. string in argument?

I referred to http://en.cppreference.com/w/cpp/language/typeid to write code which does different things for different types.

The code is as below and the explanation is given in the comments.

#include <iostream>
#include <typeinfo>

using namespace std;

template <typename T>
void test_template(const T &t)
{
    if (typeid(t) == typeid(double))
        cout <<"double\n";
    if (typeid(t) == typeid(string))
        cout <<"string\n";
    if (typeid(t) == typeid(int))
        cout <<"int\n";
}

int main()
{
    auto a = -1;
    string str = "ok";
    test_template(a); // Prints int
    test_template("Helloworld"); // Does not print string
    test_template(str); // Prints string
    test_template(10.00); // Prints double

    return 0;
}

Why does test_template(str) print "string" whereas test_template("Helloworld") does not?

BTW, my g++ version is g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609.

Upvotes: 19

Views: 3308

Answers (3)

Vlad from Moscow
Vlad from Moscow

Reputation: 311068

In this call

test_template("Helloworld"); // Does not print string

the argument "Helloworld" is a string literal that has type const char[11].

Because the function parameter is a referenced type

void test_template(const T &t) 
                          ^^^

then within the function the argument (more precisely the parameter) has the type const char ( &t )[11].

String literals in C++ have types of constant character arrays with the number of elements equal to the number of characters in string literal plus the terminating zero.

In this call

test_template(str); 

the argument has type std::string because the variable str is declared like

string str = "ok";
^^^^^^

It was initialized by the string literal "ok" nevertheless the object itself is of the type std::string.

Upvotes: 21

TartanLlama
TartanLlama

Reputation: 65640

String literals in C++ are of type const char[N+1], where N is the number of characters in the string. std::string is a standard library class which owns a string and provides a number of operations over it. A std::string can be constructed from a const char[N], but they are not the same thing.

Upvotes: 16

Some programmer dude
Some programmer dude

Reputation: 409364

String literals like "Helloworld" are constants arrays of characters.

The std::string class have a constructor that can take pointers to string literals, but a string literal is in itself not a std::string object.


As a side-note, using a function like your is considered a code-smell and bad design. Use overloaded functions taking different arguments instead. That will also solve your problem with the strings.

Upvotes: 10

Related Questions