根据C ++ 17初始化规则auto x{123};
应该是int
但是在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
如下面的参考代码中所示
答案 0 :(得分:4)
std::type_info::name返回的名称是实现定义的,不能保证返回"int"
。
返回一个实现定义的以null结尾的字符串,其中包含该类型的名称。不给予任何保证;特别是,返回的字符串对于多种类型可以是相同的,并且在相同程序的调用之间进行更改。
另一方面,您可以在编译时获取类型信息(使用未定义的类模板)。它也取决于编译器,但总的来说更清晰。 (这个想法来自Effective Modern C++(Scott Meyers)项目#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;
^
答案 1 :(得分:0)
您的代码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();
}