自动扣除可以隐式添加常量吗?

时间:2015-11-05 22:15:56

标签: c++ c++11 auto visual-c++-2015

包含以下示例:

Array

同时编译它GCCCLANG会发出相同的错误:

  

错误:类型' foo&'的非const引用的初始化无效   来自类型' foo'

的左值

然而,令我惊讶的是,它在VC ++ 2015中编译并运行良好。

  • 这是VC ++ 2015的错误吗?
  • 标准是否规定当语句呈现程序格式不正确时#include <iostream> #include <string> struct foo { std::string value; }; inline foo bar() { return { "42" }; } std::string my_func() { auto &x = bar(); ^^^^^^^^^^^^^^^^ return x.value; } int main() { std::cout << my_func() << std::endl; } 可以隐式auto添加对象?

3 个答案:

答案 0 :(得分:3)

  

这是VC ++ 2015的错误吗?

该标准允许实现接受格式错误的代码作为扩展。但是,仍然需要实现来发布诊断(这可能仅仅意味着&#34;当某些标志打开时发出警告&#34;)。

  

当语句呈现程序格式不正确时,标准是否规定auto可以向对象添加隐式const?

不,标准要求auto扣除使用与模板参数推导相同的规则(初始化列表除外)。如果T&不接受,auto&则不会。

答案 1 :(得分:2)

不,<p>Your search has returned 2 results.</p> <a>Chapter 1 - Introduction</a> <a>Chapter 2 - Say hello</a> 无法添加常量。但是,MSVC ++总是有一个扩展,非const值左侧引用可以绑定到rvalues。

我认为您可以使用auto开关禁用此扩展程序。

答案 2 :(得分:1)

  

这是VC ++ 2015的错误吗?

Redmond被告经常将其称为&#34;功能&#34;,但它在编译器的混乱中是一个完全愚蠢的错误(可用/Za修复)。让我们看看为什么......

auto &x = bar();

好的,所以你打电话给bar(),不是吗?这会生成rvalue,即没有地址的对象。现在,您无法将lvalue(可以获取其地址的对象)引用(a.k.a:&)绑定到rvalue。到目前为止,这就是您的代码非法的原因。

但是,C ++语言中有一条特殊规则允许const lvalue引用绑定到rvalue,从而有效地延长其生命周期。所以,这将是有效的代码...

const auto &x = foo();

修改:BTW ......

  

标准是否规定当语句呈现程序格式不正确时,auto可以向对象添加隐式constness?

如果T&被拒绝,将其置于非标准术语/普通英语中,auto&也将被拒绝。 CV限定符(constvolatile not 自动从auto推断出来。

我希望这能为你带来一些启示!