【问题标题】:c++ 11 typeid of string and sizeof nullptrc++ 11 typeid of string and sizeof nullptr
【发布时间】:2020-09-07 08:34:10
【问题描述】:

我是 c++11 的新手,我知道 typeid().name()nullptr。我只是在玩代码,但我发现sizeof(nullptr)4,而且typeid(str).name() 是一组复杂的字符NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

#include<iostream>

#include<string>
#include<typeinfo>

int main(){
    std::string str;
    std::cout<<sizeof(nullptr)<<std::endl;
    std::cout<<typeid(str).name();
    return 0;
}

我对输出有点困惑。谁能给我解释一下??

【问题讨论】:

  • 您希望它们变成什么?你可以看到herestd::string只是std::basic_string&lt;char&gt;的一个名字,而那个还有其他类型参数只是默认的。
  • nullptr 可能会导致 std::nullptr_t 对象。这个对象是什么以及它包含什么,是实现定义的,并不真正相关。因此nullptr 的大小也无关紧要。
  • 对于以后的问题,请每个问题问一个问题。在这里,您要问的是两个不同且不相关的事情,这使问题变得广泛且没有重点。也请花一些时间阅读the help pages,阅读SO tour,阅读How to Ask,以及this question checklist

标签: c++ string c++11 nullptr typeinfo


【解决方案1】:

这两件事都是实现定义的

sizeof(nullptr)4

我假设在那个平台上所有指针的大小都是 4,并且选择了 nullptr 的大小来匹配它。

typeid(str).name()

std::string 是模板实例化的别名std::basic_string&lt;char, std::char_traits&lt;char&gt;&gt;。该名称被进一步修改以符合您平台的可执行文件格式。平台提供的名称可能有一个“拆解”工具。

【讨论】:

    【解决方案2】:

    nullptr 的类型为 nullptr_t,即

    typedef decltype(nullptr) nullptr_t;

    所以,它是实现定义的。

    您看到的复杂字符串看起来像这样,因为 C++ 编译器正在执行名称修改。由于重载,重载是在 C++ 中完成的,因为相同的名称可以用于不同的函数或方法;或模板用于类型声明。更多相关信息您可以阅读https://en.wikipedia.org/wiki/Name_mangling#C++

    它也是实现定义的,其他编译器可能会使用其他方案进行名称修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      • 2013-05-11
      • 2013-05-06
      • 1970-01-01
      相关资源
      最近更新 更多