首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Visual 2017允许在构造函数中使用自身初始化引用成员。C++真的是合法的吗?

问Visual 2017允许在构造函数中使用自身初始化引用成员。C++真的是合法的吗?
EN

Stack Overflow用户
提问于 2019-07-09 16:19:28
回答 2查看 173关注 0票数 4

我刚刚在我的代码中发现了一个非常危险的错误,我觉得它应该被编译器捕获。我说错了吗?本质上,类的引用成员允许在构造函数中由自身初始化。下面是在Visual 2017中编译而没有错误或警告的测试代码:

代码语言:javascript
复制
struct foo
{
    foo() : reference(reference) {}

    int& reference;
};

int main()
{
    foo fooOb;
}

更新:我看到2009年有一个类似的问题。其他编译器在2017年的表现是一样的吗?还是它是VS 2017的问题?如果他们这么做了,我会觉得这是合法的C++,但我看不出这是怎么回事。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-09 16:28:47

其他编译器在2017年的表现是一样的吗?还是它是VS 2017的问题?

在写这篇文章时:

  • GCC和Clang都发出警告,-Winit-self和-Wuninitialized分别发出警告。
  • MSVC和ICC都没有对此提出警告。

如果他们这么做了,我会觉得这是合法的C++,但我看不出这是怎么回事。

从某种意义上说,编译器不需要失败编译,这是合法的,但这从来不是您想要的,因为您将触发UB。

票数 3
EN

Stack Overflow用户

发布于 2019-07-09 16:39:43

2017年MSVC收益率:

警告C26495:变量'foo::reference‘未初始化。始终初始化成员变量(类型6)

您可能需要通过转到Properties ->代码分析(/analyze)来启用代码分析

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56956828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档