Какое имя говорит мне битсет? - PullRequest
0 голосов
/ 31 января 2020

Вот тривиальный фрагмент кода, который дает название типов автоматической даты. Итак, мне было интересно, какой битсет будет иметь идентификатор. он возвращает: "St6bitsetILm32EE". Хорошо, bitset - это тип данных, 32 - размер, я не уверен, что еще говорит мне это имя. Я не знаю, на что ссылаются St6, I, LM или EE. Разъяснение было бы хорошо.

// C++ program to demonstrate working of auto 
// and type inference 
#include <bits/stdc++.h> 
using namespace std; 
#define M 32  
int main() 
{ 
    auto x = 5;    //i for integer
    auto y = 3.37; //D for double
    auto ptr = &x; //Pi for pointer
    auto z = "WTF";//PKc for string or char**
    bitset <M> bset(2);
    auto k = bset; //bitset :: St6bitsetILm32EE  
     cout << typeid(x).name() << endl 
         << typeid(y).name() << endl 
         << typeid(k).name() << endl 
         << typeid(ptr).name() << endl 
         << typeid(z).name() << endl; 

    return 0; 
} 

простите за мои комментарии, я буквально только что узнал об автоматическом типе данных.

1 Ответ

5 голосов
/ 31 января 2020

Имена в C ++ искалечены .

Я предполагаю, что название было искажено в соответствии с Itanium C ++ ABI правилами. Правила определяют способ искажения каждого типа / идентификатора / имени функции. Исходя из этого, вы можете попытаться вручную разобрать тип:

  • St is <substitution>. Используется для сжатия ::std:: префикса пространства имен.
  • 6 - это <number>. Затем он кодирует длину следующего идентификатора. Следующие 6 символов составляют идентификатор.
  • bitset равен <identifier>. В нем 6 символов. Это идентификатор этого класса.
  • I начинается <template-args>. Это список аргументов шаблона.
    • Затем следует один <template-arg>
    • L, начинается <expr-primary>.
      • m равно <type>. Это тип аргумента шаблона, а не его значение. m означает, что типом является unsigned long.
      • 32 - значение, переданное в качестве параметра шаблона. 32 здесь не размер.
    • E заканчивается <expr-primary>.
  • E заканчивается <template-args>.

Итак St6bitsetILm32EE - искаженное имя для типа ::std::bitset<(unsigned long)32>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...