C++ 是C++;11是否为所有情况准确定义了自动关键字?或者:auto如何知道我的意图?

C++ 是C++;11是否为所有情况准确定义了自动关键字?或者:auto如何知道我的意图?,c++,auto,C++,Auto,比方说,在C++11中,我是这样做的 auto a = 4; a将是什么?一个int(我经常读到),一个无符号int,一个短的,一个长的,一个大小,一个字符?是否总是定义了auto的行为,在每个编译器和每个体系结构上是否总是完全相同的类型(具有完全相同的位长度!) 另一个例子: class A{}; class B:A{}; auto x = new B(); x是属于*B类型还是属于*A类型?在每个编译器和平台上总是相同的吗?两者都是完全合法的,编译器如何知道我想要哪一个 是否有自动行为的

比方说,在C++11中,我是这样做的

auto a = 4;
a
将是什么?一个
int
(我经常读到),一个
无符号int
,一个
短的
,一个
长的
,一个
大小
,一个
字符
?是否总是定义了
auto
的行为,在每个编译器和每个体系结构上是否总是完全相同的类型(具有完全相同的位长度!)

另一个例子:

class A{};
class B:A{};
auto x = new B();
x
是属于
*B
类型还是属于
*A
类型?在每个编译器和平台上总是相同的吗?两者都是完全合法的,编译器如何知道我想要哪一个


是否有
自动
行为的确切列表?

在第一种情况下,
a
将是
int
,请参见下文:

auto a = 4 ; // int
auto b = 4U ; // unsigned int
auto c = 4L ; // long int
auto d = 4LLU ; // unsigned long long int, maybe it's ULL i don't remember...
auto x = 4.0 ; // double
auto y = 4.0f ; // float
事实上,有一种方法可以用C编写任何类型的
int

对于
newb()
,编译器将接受唯一的答案,即
B*

auto
匹配分配给变量的正确值的类型,而不尝试推断任何内容,这不是它的工作


您不应该将
auto
关键字视为神奇的东西,而应该将其视为在您不想使用大声明类型时可能会有所帮助的东西。

编译器不知道您想要什么,也不在乎。a或x的类型是右侧表达式的类型。由于4的类型是int,而new B()的类型是B*,这与编写int a=4时的情况相同;B*x=新的B()自动
只能使用 当存在初始化表达式时。类型将是 该表达式的类型。例如,表达式
4
, 始终具有类型
int
,并且
new B()
的类型为
B*
, 总是

当然,编译器对类型是清楚的 但这并不意味着读者很清楚。滥用
auto
一种使程序不可读的好方法,也可以使 它是脆弱的,因为编译器无法检查它们是否为 初始化表达式与所需的 类型

a
将是什么

int
,因为这是
4
的类型

x
是属于
*B
类型还是属于
*A
类型

B*
,因为这是新B()的类型

是否有
自动
行为的确切列表

通常,它是初始化器的类型;除非它是引用类型,否则它就是底层对象类型。如注释中所述,对于数组等不寻常的类型,还有一些其他缺陷

在每个编译器和每个体系结构上,它是否总是完全相同的类型(具有完全相同的位长度!)

在大多数情况下,初始化器有一个定义良好的类型,该类型确定由
auto
推导的类型


如果初始化器是整数文本,那么类型可能取决于平台;例如,
1000000
在32位平台上可能是
int
,但在16位平台上可能是
long

是的,它总是定义良好的。RHS上的表达式解析为编译时已知的特定类型。
int
在所有体系结构/编译器上的长度不同
4
始终是
int
@dyp
4
始终是
int
,但
123456
可能是
int
long123456
将是
长的,如果足够大,但
int
无符号的int
则不是(如C++>11.14/2,表6所规定).@FooBar:
a
将与literal
123456
的类型相同;该类型将是可以表示该值的最小整数类型,但不小于
int
。编译器不接受最简单的答案,只接受唯一的答案。确保使用
auto
获得
size\u t
的唯一方法是
auto a=static\u cast(4)
(或者使用其他类型为
size\u t
的表达式初始化它)。@Holt:从技术上讲,
auto
有一个“怪癖”,即删除引用。不确定常量和volatile,它可能会保留它们。@MooingDuck:它也会删除顶级常量/volatile<代码>常数int x=100;自动y=x这里的
y
int
,而不是
const int
。。。。非常类似于模板参数推断。在某些情况下,变量的类型将不是表达式的类型,最突出的是数组到指针的转换,例如字符串文字。
auto
declays字符串文字?我不知道!它应该完全是
const char(&)[
…哦。
auto
去掉了引用。是的,指针衰减是有意义的:(数组到指针的转换也适用,以及带括号的init列表的特殊情况……他说他过于简化了,但这仍然是最详细和准确的答案。