【问题标题】:"Always Use Auto" in C++11? [closed]C ++ 11中的“始终使用自动”? [关闭]
【发布时间】:2014-10-24 09:13:32
【问题描述】:

C++ 大师 Herb Sutter 建议我们应该几乎总是使用“auto”。他在website 上声明了这一点,他最近在CppCon 2014 conference 上重复了这一点。

我试图听从他的建议,但我不相信。这里有人同意萨特的观点吗?谁能告诉我原因

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

优于

string gender, number, person;

这是我最终在我的代码中编写的,因为我无法忍受 auto 样式。

编辑:

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

也是一种可能,但在我看来,情况更糟。

【问题讨论】:

  • 帮自己和其他人一个忙,用 std::string 代替 string。
  • 在一行上声明多个变量通常也是不受欢迎的。
  • @hagubear 我是说这是令人毛骨悚然的扭曲逻辑。为什么会有人重新定位。有了这个逻辑,每个人都应该恢复到 c。如果我们坚持c++89“以防万一”,也许c++ 委员会应该解散,因为他们工作的重点是什么。无论编译器是否为 c++11 编译器,我什至不会评论通过预处理将代码加倍的想法。
  • @oz1cz:是的,auto 被过度使用了。不,与 Herb Sutter 所说的相反,到处使用 auto 是没有好处的。
  • @hagubear "你不能指望每个人都能像那样切换!" - 确切地说,这就是为什么你首先做出(商业)决定预测您将/需要支持的标准,以及所有的利弊。 “我只是说采取措施并准备好支持一切。” - 这是错误的逻辑。从字面上看,要为所有事情做好准备是不可能的。做“以防万一”的事情会无缘无故地阻碍您的开发过程。技术限制和要求应该在第一行代码之前明确。

标签: c++ c++11 auto


【解决方案1】:

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;

【讨论】:

  • 在这种情况下你是对的。但问题涉及一个使用默认构造函数直接构造对象的情况。在您在这里提到的情况下,我对 auto 没有任何问题,但我确实觉得 type variableauto variable = type{} 更简单、更易读。
  • 啊,对,我认为这是一个更笼统的问题。您的案例是他为什么说“几乎总是”的一个例子。如果您在本地函数范围内创建对象,那么您知道类型是什么也是有意义的,因此应该声明该类型的变量。 auto 应该用于从其他地方获取值并可以从该值初始化它的变量(因为这使代码更易于维护,就像我在回答中提出的那样)。
  • 更新了答案以更好地回答实际问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多