在 C++11 中使用自动
Usage of auto in C++11
本文关键字:C++11 更新时间:2023-10-16
当我使用auto
来推断指针类型时,我发现了一个奇怪的现象。我的代码是这样的:
#include <iostream>
using namespace std;
int main()
{
int i = 100;
auto p1 = &i;
auto *p2 = &i;
cout << *p1 << " " << *p2 << endl;
return 0;
}
编译执行后,我们可以发现 *p1
和 *p2
的结果是一样的,都是 100。这意味着p1
和p2
都是指向int
对象的指针对象。
[user@host ~]$ ./test
100 100
定义p1
和p2
的这两个语句之间有什么区别吗?
区别在于在第一种情况下,auto被推导出为int*
,而在第二种情况下,auto被推导出为int
,这导致p1
和p2
都是int*
类型。auto 的类型推导机制等效于模板参数的类型推导机制。因此,示例中的类型推导类似于
template<typename T>
void foo(T p1);
template<typename T>
void bar(T* p2);
int main()
{
int i;
foo(&i);
bar(&i);
}
其中两个函数都实例化为类型void(int*(,但在第一种情况下T
被推导出为int*
,而在第二种情况下,T
具有类型int
。
变量
声明中使用的auto
说明符,推导其类型 使用与模板参数中使用的相同规则 演绎。
考虑您的第一个示例(即auto p1 = &i;
(。的类型 auto
说明符推导如下:
-
auto
被替换为虚构类型模板参数(例如,U p1 = &i;
(。 -
&i
类型是int*
的,因此没有意外,根据模板演绎规则,U
被推导出为int*
。
现在考虑你的第二个例子(即auto *p2 = &i
(。
- 再次
auto
替换为虚构类型模板参数(例如,U* p1 = &i;
(。 -
&i
类型是int*
,因此根据模板演绎规则U
被推导出int
。
因此,在auto *p2 = &i;
占位符类型auto
将正确地推断为int
而不是int*
,这将导致p2
属于int**
类型,正如您可能已经预料的那样。
相关文章:
- MSVC是否支持C++11样式的属性而不是__declspec
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何将模板转换为C++11之前的模板
- c++11评估顺序(未定义的行为)
- C++中的VLA,扩展名为std=C++11
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- "类模板示例<int>;"语句对 C++11 是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 如何使用lock_guard在c++11中实现scoped_lock功能
- C++11 中不同类型的对象的 std::array 的替代方案
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- STLPort using C++11
- Qt 5.11.2 (Clang 8.0 (Apple), 64 位), 找不到 QJSEngine 文件
- 在 C++11 中,如何查找并返回以给定字符串开头的字符串向量中的所有项?
- C++11 迭代向量的新方法?