【问题标题】:Can you use auto with a comma你能用逗号用auto吗
【发布时间】:2017-12-08 17:22:59
【问题描述】:

您能否使用auto 推导类型,其中您有一个逗号来指示两个或多个变量的初始化。像这样:

 auto p = c.begin(), e = c.end();

或者两个初始化的存在(可能)对编译器来说太混乱了? C++ 标准允许什么?

【问题讨论】:

  • 你试过了吗?
  • auto [p, e] = std::make_pair(c.begin(), c.end()); :-)
  • @pm100 这不是问题的运作方式。尝试某些东西可能会告诉您特定编译器允许什么,而不是语言允许什么。
  • @Raedwald 你问它是否对编译器来说太混乱了。如果您自己尝试过,您可能会发现您的编译器并不混乱。
  • @pm100 meta.stackexchange.com/a/172760/170084 我的问题不是一个不费吹灰之力的菜鸟“调试我”或“做我的功课”问题,而是关于如何允许两种语言工具交互的问题。

标签: c++ initialization auto


【解决方案1】:

是的,只要它们属于同一类型(在您的示例中就是这样),您就可以这样初始化它们。

【讨论】:

  • 在同一行中声明不相关的实体确实会对可读性产生不利影响。但是在单个声明中(甚至在一行中)声明 密切相关 实体应该是完全可以的。 (例如“开始”和“结束”迭代器。)我会说它甚至提高了可读性。 C++17 中的结构化绑定声明实际上是朝着这个方向迈出的一步,许多其他语言特性也是如此。 (不是我的反对票,顺便说一句)
  • 不明智的推荐将 +1 变成了 -1。 auto b = v.begin(), e = v.end() 是一种惯用方式。
  • 公平点我拿出我的个人意见,因为它妨碍了正确答案。
【解决方案2】:

您可以使用自动推导类型,其中有一个逗号运算符来指示两个或多个变量的初始化。

是的。

或者是否存在两个初始化对编译器来说太混乱了?

不,不是。只要自动推导不会导致在同一语句中使用auto 声明多个变量的类型不一致就可以。

来自C++11 Standard/7.1.6.4 auto specifier/3

auto x = 5;                 // OK: x has type int
const auto *v = &x, u = 6;  // OK: v has type const int*, u has type const int

但是,您不能使用:

const auto *v = &x, u = 6.0;

并希望v的类型推导为const int*u的类型推导为const double

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 2015-01-23
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多