C++ 自动推断可以隐式地增加常量吗?

C++ 自动推断可以隐式地增加常量吗?,c++,c++11,auto,visual-c++-2015,C++,C++11,Auto,Visual C++ 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::cou

请考虑以下示例:

#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;  
}
#包括
#包括
结构foo{std::string value;};
内联foo-bar(){return{“42”};}
std::string my_func(){
自动&x=bar();
^^^^^^^^^^^^^^^^
返回x.value;
}
int main(){

std::coutNo,
auto
无法添加常量。但是,MSVC++一直有一个扩展,非常量左值引用可以绑定到右值

我想,您可以使用
/Za
开关禁用此扩展

这是VC++2015的一个bug吗

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

标准是否规定当语句呈现程序格式错误时,
auto
可以隐式地向对象添加常量

否,该标准要求
auto
演绎使用与模板参数演绎相同的规则(初始值设定项列表除外)。如果
T&
不接受该规则,则
auto&
将不接受该规则

这是VC++2015的一个bug吗

Redmond的被告经常称它为“功能”,但它是一个完全愚蠢的错误,在一个混乱的编译器中(可通过
/Za
修复)。让我们看看为什么

auto &x = bar();
好的,那么您正在调用
bar()
,不是吗?这会生成一个
rvalue
,即一个没有地址的对象。现在,您不能将
lvalue
(一个可以获得地址的对象)引用(又称
&
)绑定到
rvalue
。到目前为止,这就是您的代码非法的原因

但是,C++语言中有一个特殊的规则,允许<代码> const LValue rValue/COD>,有效地延长它的寿命。因此,这是有效的代码…< /P>

const auto &x = foo();
编辑:顺便说一下

标准是否规定,当语句呈现程序格式错误时,auto可以隐式地向对象添加常量

用非标准术语/普通英语来说,如果
T&
被拒绝,那么
auto&
也会被拒绝。CV限定符(
const
volatile
)不会自动从
auto
中推导出来


我希望这对您有所启发!

“CV限定符(
const
volatile
)不是从
auto
自动推导出来的。”不完全一样。
const int c=1;auto&d=c;/*好的,d是const int&*/
它不会凭空变出cv限定符,但是如果初始值设定项是cv限定符,它会非常高兴地推导出@t.c。我要补充的是,它甚至可以与右值一起工作:
auto&d=std::move(c)
将进行编译。但你看不到那么多符合常量的右值。你在说什么?我目前与GNU/Linux合作,私下里有一台Mac,但我必须为“Redmond”辩护,因为编译器可以自由地接受格式错误的代码作为扩展(可能需要警告除外,如前所述)这个特定的扩展是否值得,这是一个不同的话题。例如,GCC开发人员实际上乐于提供任何其他编译器团队的扩展——记住C++签名吗?没有“纯标准C++”。我知道的编译器,甚至不仅仅是默认的。@ArneVogel:GNU/Linux,当然;)。我的观点是,大多数“功能”在被称为功能之前很久就被报告为bug,更不用说它们几乎没有被记录。GCC至少记录了
\uu属性(())
。。。