C++ auto与auto&的区别

11

如果我有一个函数:

Foo& Bar()
{
   return /// do something to create a non-temp Foo here and return a reference to it
}

为什么会出现这种情况:

auto x = Bar(); /// probably calls copy ctor - haven't checked

不同于这个吗?

auto &x = Bar(); /// actually get a reference here

(实际上,我预期第二个版本会得到一个引用的引用,这没有多少意义。)

如果我明确指定了x的类型为值或引用,我会得到我期望的结果(当然)。不过,我希望auto编译成Bar()的返回类型,而在这种情况下,它是一个引用。

这里是否存在FooFoo&之间的隐式转换?

(接受规范参考,尽管我已经厌倦了阅读委员会说话。)

(第二次使用时间机器将默认按引用传递C++。使用#pragma compatibility触发器编译C代码。ARGH。)


2
这样浪费时间。传递引用是邪恶的。可变数据的别名会创建数据竞争,破坏优化机会等。将其设置为默认值将是可怕的。 - Ben Voigt
@BenVoigt 有很好的观点,但我花了很多时间打 'const T&' 这个东西,我宁愿花时间去喝酒。 :/ - 3Dave
你可能正在使用错误的编程语言。我相信其他语言更适合你的编程风格。 - Ben Voigt
@BenVoigt 我使用多种语言。我之所以问是因为我想知道为什么它没有做到我期望的事情。(也就是说,我的期望是错误的,我应该如何调整我的观点,以更好地与语言设计者的观点相一致。)“你可能正在使用错误的语言”并没有真正回答什么、为什么或如何。 - 3Dave
@BenVoigt 哦,我明白了。我看错了。谢谢。 - 3Dave
显示剩余2条评论
2个回答

30
< p > auto 的类型推导与模板完全相同:

  • 当你用 auto 推导时,会得到一个值类型。
  • 当你用 auto& 推导时,会得到一个非常量引用类型。
  • 当你用 const auto& 推导时,会得到一个常量引用。
  • 当你用 auto&& 推导时,如果赋值为非常量引用,则会得到一个非常量引用;如果赋值为常量引用,则会得到一个常量引用;如果赋值一个临时对象,则会得到一个值类型。

欢迎来到 Stack!回答非常好。我希望你能继续留下来,为问题和答案做出贡献。 - 3Dave
2
虽然没有太明确的解释,但这确实解释了为什么需要"与模板一致"。"与模板一致"是好的,因为(1)程序员已经熟悉规则,(2)编译器可以重用现有的模板类型推断逻辑来处理“auto”。 - Ben Voigt
3
很不幸,在这种情况下,情况也很糟糕,因为模板规则非常晦涩难懂。 - Lightness Races in Orbit
值类型和非 const 引用类型有什么区别?即 auto vs auto &。我知道它们在函数签名中会有所不同,但是在变量声明中使用时我并不明白。 - yuqli

15

直接摘自Herb Sutter的博客文章:

auto表示“准确地采用右侧的类型,但剥去顶层const/volatile和&/&&。”


好快啊,我猜这就是为什么它们没有叫它 var。 :/ - 3Dave
这解释了“什么”,但没有解释“为什么”。 - Ben Voigt

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