包含以下示例:
Array
错误:类型' foo&'的非const引用的初始化无效 来自类型' foo'
的左值
然而,令我惊讶的是,它在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
添加对象?答案 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限定符(const
和volatile
) not 自动从auto
推断出来。
我希望这能为你带来一些启示!