Visual C++ 2015 中右值的非常量引用初始化无效

invalid initialization of non-const reference from an rvalue in Visual C++ 2015

本文关键字:常量 非常 引用 初始化 无效 C++ 2015 Visual      更新时间:2023-10-16

大多数编译器在以下代码中检测到错误。

struct Foo
{
    int i;
};
Foo create_foo()
{
    return { 42 };
}
int main()
{
    Foo& my_foo = create_foo(); // This should trigger a compiler error.
    my_foo.i = 33; // Undefined behaviour!
}

我的机器上的视觉C++ 2015 没有。是否有编译器标志/警告级别或我可以设置的内容以使VC2015检测到错误?

MSVC 有一个允许这样做的扩展,所以默认情况下,这不是一个错误。您可以使用标志/Za或在 IDE 中通过以下方式禁用扩展

  1. 打开项目的"属性页"对话框。有关详细信息,请参见如何:打开项目属性页。
  2. 在导航窗格中,依次选择配置属性、C/C++、语言。
  3. 修改"禁用语言扩展"属性。

(来自文档)

然后,MSVC 将尝试遵循语言标准。

您没有收到警告的原因是因为您的警告级别不够高,为此需要 4 级。默认情况下,MSVC 会将其设置为 3。

属性页 => C/C++ => 常规 => 警告级别:级别 4 (/W4)

或者正如 Baum mit Augen 指出的那样,禁用扩展,尽管如果您使用像 <windows> 这样的标头,这并不那么简单,因为其中一些使用扩展,并且会出现编译错误。

属性页 => C/C++ => 语言 => 禁用语言扩展 属性:是 (/Za)