为参数中的变量与字符串键入 std::string 的 id?

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

我参考 http://en.cppreference.com/w/cpp/language/typeid 编写了针对不同类型执行不同操作的代码。

代码如下,注释中给出解释

#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;
}

为什么 test_template(str) 打印 "string" 而 test_template("Helloworld") 不打印?

顺便说一句,我的g++版本是g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609.

"Helloworld" 这样的字符串文字是字符常量数组。

std::string class 有一个构造函数可以接受指向字符串文字的指针,但字符串文字本身不是 std::string 对象。


作为旁注,使用像您这样的函数被认为是代码异味和糟糕的设计。改用采用不同参数的重载函数。这也将解决您的字符串问题。

C++ 中的字符串文字是 const char[N+1] 类型,其中 N 是字符串中的字符数。 std::string 是一个标准库 class,它拥有一个字符串并提供了一些对其的操作。 std::string 可以从 const char[N] 构造,但它们不是一回事。

在本次通话中

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

参数 "Helloworld" 是类型为 const char[11] 的字符串文字。

因为函数参数是引用类型

void test_template(const T &t) 
                          ^^^

然后在函数内,参数(更准确地说是参数)的类型为 const char ( &t )[11]

C++ 中的字符串文字具有常量字符数组类型,其元素数等于字符串文字中的字符数加上终止零。

在本次通话中

test_template(str); 

参数的类型为 std::string 因为变量 str 声明为

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

它是由字符串文字 "ok" 初始化的,但是对象本身是 std::string.

类型