【问题标题】:Implicit auto type specifier隐式自动类型说明符
【发布时间】:2020-06-03 20:08:09
【问题描述】:

我想知道为什么在某些/所有情况下不能完全省略 auto 关键字,例如

int main()
{
  [](auto x){}(10); // why this?
  [](x){}(10); // and not this?

  auto x = 10;
  x = 10;
}

是否存在歧义或类似问题?还是简单的设计选择?

【问题讨论】:

  • 你得问问标准委员会的人,因为我们大多数人能做的就是推测。
  • auto x = 10; 变量定义和初始化。 x = 10; 现有变量的赋值。完全不同的东西。
  • 你的问题有一半是answered here
  • @Yamahari 我不喜欢这个改变。如果我写了x = 10; 而没有定义x,它会让我知道我犯了一个错误。要么我忘了写一个类型(即使它是auto),要么我拼错了一个标识符。在第一种情况下保护自己免受第二种情况的麻烦是值得的。
  • 不幸的是 abbreviated lambdas 被拒绝了。

标签: c++ auto


【解决方案1】:

考虑一下:

 struct x {};

 [](x){}(10);

这是一个带有 x 类型的未命名参数的 lambda(根据当前的语言规范)还是推导类型的名为 x 的参数(根据您的建议)?您建议的语法与函数参数声明的预先存在的语法有歧义。


x = 10;

这更成问题,因为它与赋值无法区分。写这篇文章的人可能正在尝试定义一个变量(您的建议),但它也可以是根据上下文分配现有变量。 C++ 有太多的语法歧义(对于程序员来说)。我们应该避免添加更多。

【讨论】:

  • 我明白了,但在这种情况下,它可能是一个编译时错误,表明存在歧义,不是吗?
  • @Yamahari 但现在不是模棱两可了。将编译错误引入以前格式正确的程序是委员会和我们语言的用户希望避免的事情,除非格式正确的代码被破坏。
  • @Yamahari 这就是 lambda 函数语法的工作原理。这里没什么好讨论的。我们可以长时间讨论为什么它是 int x = 10; 而不是 x : int = 10; 或其他方式,但这对任何人都没有用。
猜你喜欢
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
相关资源
最近更新 更多