假设我有这样的事情:
namespace {
const unsigned MY_UINT = 100u;
const float MY_FLOAT = 0.f;
const char* MY_STRING = "Hello World";
}
使用auto
来获取预期的行为吗?我认为这是一种改进,但我在实践中并不确定。
namespace {
auto MY_UINT = 100u;
auto MY_FLOAT = 0.f;
auto MY_STRING = "Hello World";
}
两个代码示例在语义上是否相同?这些会自动const
吗?如果没有,我应该指定auto const
吗?
答案 0 :(得分:3)
auto
的演绎规则等同于按值模板参数演绎。按值创建对象需要从初始化程序中剥离引用和顶级cv限定符。你的两个例子并不等同。特别是,原始100u
的类型为unsigned int
,因此它被推断为。同样,0.f
的类型为float
。
如果不修改变量本身,则添加const
才有意义。如果您想在程序中创建常量,使用constexpr
可能会更好。
答案 1 :(得分:1)
是的,您必须手动指定const
。
不,这不是一个好习惯。您通常不应过度使用auto
。如果类型名称很长,那么该关键字会很有用,但typedef
通常是更好的解决方案。 Auto
掩盖了代码。而且,这有利于错误。有时,推断编译器的类型可能与您的意思不同。
如果您愿意,可以使用auto
,但如果没有理由,最好不要这样做。
答案 2 :(得分:1)
不,他们不一样。
键入时:
auto var = 123u;
与以下内容相同:
unsigned var = 123u;
要实现
const unsigned var = 123u;
你应该写
const auto var = 123u;
不要期望汽车太多。某种神奇的猜测。