使用初始化列表时的 C++ auto 关键字

Was*_*son 6 c++

当我运行下面的代码时,我有一个关于使用关键字 auto 的问题:

auto i_num = {1};
printf("%x", i_num);//61fecc
return 0;
Run Code Online (Sandbox Code Playgroud)

我认为它与下面的相同,但不是:

int i_num = {1};
printf("%x", i_num);//1
return 0;
Run Code Online (Sandbox Code Playgroud)

谁能给我解释一下这个区别吗?看来 auto i_num 和 int i_num 定义了不同的东西。

Mar*_* F. 9

一个是integer另一个std::initializer_list<int>

auto var_auto = {1};
std::cout << typeid(var_auto).name() << std::endl;//St16initializer_listIiE

int var_int = {1};
std::cout << typeid(var_int).name() << std::endl;//i
Run Code Online (Sandbox Code Playgroud)

该表达式{1}定义了一个初始值设定项列表。这被分配给 auto 变量。删除“=”以获得您的期望。

auto var_auto{1};
std::cout << typeid(var_auto).name() << std::endl;//i
Run Code Online (Sandbox Code Playgroud)


Kev*_*tti 5

该行auto i_num = {1}定义了一个类型为 的变量std::initializer_list<int>
您应该收到编译器发出的警告,告知您正在尝试使用该%x格式打印初始值设定项列表。
它打印初始化列表中第一项的地址(不是初始化列表地址)。

auto i_num = {1};
printf("%x\n", i_num); //58a74744
printf("%x\n", &i_num); //58a74730
printf("%x\n", i_num.begin()); //58a74730
Run Code Online (Sandbox Code Playgroud)