C++ 便携性是汽车的一个问题吗?

C++ 便携性是汽车的一个问题吗?,c++,c++11,auto,C++,C++11,Auto,auto很有用,因为您不必写出类型。但我想知道的是,在类型可能不同的系统上,为auto推导的类型是否会影响程序的结果。我用auto编写的程序可以到处移植吗?或者我仍然需要手动担心类型吗?如果您需要特定的或最小的类型,您可能需要使用中的那些类型,但是如果您需要特定的或最小的类型,则不应该对auto的移植性有任何顾虑类型的最小大小您可能需要使用中的这些类型,但除此之外,auto不应该存在可移植性问题是auto可移植的结果吗?那么,让我们举一个简单的例子: auto i = 123456; 这会到处

auto
很有用,因为您不必写出类型。但我想知道的是,在类型可能不同的系统上,为
auto
推导的类型是否会影响程序的结果。我用
auto
编写的程序可以到处移植吗?或者我仍然需要手动担心类型吗?

如果您需要特定的或最小的类型,您可能需要使用
中的那些类型,但是如果您需要特定的或最小的类型,则不应该对
auto

的移植性有任何顾虑类型的最小大小您可能需要使用
中的这些类型,但除此之外,
auto

不应该存在可移植性问题是
auto
可移植的结果吗?那么,让我们举一个简单的例子:

auto i = 123456;
这会到处编译吗?对这是否意味着各地都一样?否。在16位系统上,这会将
i
声明为
long
。这是个问题吗?不是真的。事实上,它通过在需要的地方声明一个更大的类型来帮助可移植性。但这只是运气:

auto i = 192 * 643;
溢出,尽管在数学上是一样的


在第二个示例中,您不知道
std::vector::iterator
的实际类型,因此
auto i=myVec.begin()
的类型未知。这种类型在编译器之间会有所不同。但是,这些都是无关紧要的细节。重要的是,
i
可以用于迭代(和更改)
myVec
自动
可移植的结果吗?那么,让我们举一个简单的例子:

auto i = 123456;
这会到处编译吗?对这是否意味着各地都一样?否。在16位系统上,这会将
i
声明为
long
。这是个问题吗?不是真的。事实上,它通过在需要的地方声明一个更大的类型来帮助可移植性。但这只是运气:

auto i = 192 * 643;
溢出,尽管在数学上是一样的


在第二个示例中,您不知道
std::vector::iterator
的实际类型,因此
auto i=myVec.begin()
的类型未知。这种类型在编译器之间会有所不同。但是,这些都是无关紧要的细节。重要的是,
i
可以用于迭代(和更改)
myVec

使用auto-Yes时,我会更担心const和reference,您必须在一定程度上继续担心。例如,您通常可以在一个具有32b int的平台上测试和运行,并且一切都很好。然后你的代码被移植到一个有16b int的平台上,突然你的循环不再做你想做的事情,因为你的循环计数器以一种意想不到的方式滚动。这样的事情可能很少发生,但这是可能的。我想说的是,在不同的系统上,自动的类型会有所不同,这可以提高可移植性。如果你使用正确的话,我会更担心const和reference,当你使用auto时,是的,你必须在一定程度上继续担心。例如,您通常可以在一个具有32b int的平台上测试和运行,并且一切都很好。然后你的代码被移植到一个有16b int的平台上,突然你的循环不再做你想做的事情,因为你的循环计数器以一种意想不到的方式滚动。这样的事情可能很少发生,但这是可能的。我想说的是,在不同的系统上,自动的类型会有所不同,这可以提高可移植性。如果您正确使用它。那么整数提升的一些怪癖呢?涉及比
int
无符号int
大/小/大小相同的类型?要添加到这一点,您不应该使用auto,因为它允许您忽略类型或保存一些击键,您应该使用auto,因为它可以使代码更加正确,并记录代码中类型的意图。Herb Sutter对此进行了更详细的介绍,对于整数升级的一些怪癖,比如类型大于/小于/等于
int
unsigned int
?此外,您不应该使用auto,因为它允许您忽略类型或保存一些击键,您应该使用auto,因为它可以使代码更加正确,并记录代码中类型的意图。Herb Sutter对此进行了详细介绍