自动初始值设定项类型ID 信息

auto initializer typeid info

本文关键字:类型 ID 信息      更新时间:2023-10-16

根据 C++17 初始值设定项规则,应该intauto x{123};,但在 C++11/C++14 模式下使用不同的编译器尝试此操作将显示一些编译器会将其推断为int而其他人会将其推断

std::initialzer_list<int>

我使用 C++17 只是为了测试它

#include<iostream>
#include <typeinfo>
int main()
{
auto x{123};
auto y={1,2};
std::cout<<"Type is "<<typeid(x).name()<<std::endl;
std::cout<<"Type is "<<typeid(y).name()<<std::endl;
}

输出

Type is i
Type is St16initializer_listIiE
Program ended with exit code: 0

不应该显示吗 预期输出

Type is int 

如以下参考代码中所示

https://en.cppreference.com/w/cpp/language/typeid

std::type_info::name 返回的名称是实现定义的,不能保证返回"int"

返回一个实现定义的以 null 结尾的字符串,其中包含类型的名称。不提供任何保证;特别是,返回的字符串对于几种类型可以是相同的,并且可以在同一程序的调用之间更改。

另一方面,您可以在编译时获取类型信息(使用未定义的类模板)。它也取决于编译器,但通常更清楚。(这个想法来自有效的现代C++(斯科特·迈耶斯)项目#4:知道如何查看推导的类型。

template <typename>
struct TD;
int main()
{
auto x{123};
auto y={1,2};
TD<decltype(x)> td1;
TD<decltype(y)> td2;   
}

然后,您将从编译错误消息中获取类型信息,例如 Clang:

source_file.cpp:12:21: error: implicit instantiation of undefined template 'TD<int>'
TD<decltype(x)> td1;
^
source_file.cpp:13:21: error: implicit instantiation of undefined template 'TD<std::initializer_list<int> >'
TD<decltype(y)> td2;
^

使用您的代码,x{123}计算结果为 int,因为这就是您传递的。但是,使用 y,您已经向它传递了一个整数列表。它推断出它是一个initializer_list,因为这是默认类型,根据此示例在initializer_list构造中使用。

#include <iostream>
#include <typeinfo>
#include <initializer_list>
class Test
{
public:
Test(std::initializer_list<int> ints) {
for (auto i : ints)
{
std::cout << i << std::endl;
}
}
};
int main()
{
auto x{ 123 };
auto y = { 1,2 };
std::cout << "Type is " << typeid(x).name() << std::endl;
std::cout << "Type is " << typeid(y).name() << std::endl;
Test t{ 1, 2, 3 };
std::cin.get();
}