C++11中始终使用Auto?

7
C++大师Herb Sutter建议我们几乎总是使用“auto”。他在他的网站上表达了这个观点,并最近在CppCon 2014会议上重申了这一观点。我尝试遵循他的建议,但并不被说服。有没有同意Sutter观点的人可以告诉我原因?
auto gender = string{};
auto number = string{};
auto person = string{};

更好。
string gender, number, person;

这就是我在代码中最终编写的内容,因为我无法忍受自动样式。

编辑:

auto gender = string{}, number = string{}, person = string{};

还有一种可能性是使用 iFrames,但在我看来,这甚至更糟。


9
请为自己和其他人着想,使用std::string而不是string。 - gnasher729
7
在一行中声明多个变量通常受到反对。 - gnasher729
5
@hagubear,我在说这是扭曲的逻辑。为什么会有人重新定位目标?按照这个逻辑,每个人都应该回到C语言。也许C++委员会应该解散,因为如果我们应该坚持c++89,他们的工作有什么意义呢?无论编译器是否符合C++11标准,我甚至不想评论使用预处理将代码翻倍的想法。 - luk32
4
“@oz1cz: 是的,auto被过度使用了。不,与Herb Sutter所说的相反,到处使用auto并不有益。” - user541686
5
你不能期望每个人都能够像那样轻易地转换!” - 没错,这就是为什么你首先要对一个项目做出(商业)决策,决定你将/需要支持哪些标准,包括所有的利弊。 “我只是在说采取措施并准备支持一切” - 这是错误的逻辑。实际上不可能准备好应对所有情况。为了无谓的理由而“以防万一”会妨碍你的开发流程。技术上的限制和需求应该在编写第一行代码之前就清楚明确。 - luk32
显示剩余10条评论
1个回答

2
auto关键字主要应用于变量初始化的情况,当你需要改变初始化值时,使用auto可以使代码更易于维护:
uint16_t id_ = 65535;

uint16_t id()
{
    return id_;
}

auto myid = id();

如果id()的返回类型更改,无需更改myid的类型。

而且,在C++14中它变得更好了:

uint16_t id_ = 65535;

decltype(auto) id()
{
    return id_;
}

auto myid = id();

更改id_的类型会自动调整id()的返回类型和myid的类型。

在变量的初始值未被初始化且不依赖其他代码进行初始化的情况下,明确定义变量类型是有意义的,因为auto关键字不会增加代码的可维护性,而语法auto gender = string{};string gender;不易读。


3
在这种情况下,你是正确的。但问题涉及到一种直接使用默认构造函数构建对象的情况。我对你在这里提到的情况中使用auto没有任何问题,但我认为“type variable”比“auto variable = type{}”更简单易读。 - oz1cz
1
啊,好的,我以为这是一个更一般性的问题。你的情况就是为什么他说“几乎总是”的一个例子。如果你在本地函数作用域中创建对象,那么你知道类型并且应该声明该类型的变量。auto 应该用于从其他地方获取值并可以从该值初始化变量的变量(因为这使代码更易于维护,就像我在我的答案中所展示的那样)。 - heksesang
更新了答案以更好地回答实际问题。 - heksesang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接