Visual Studio 2013是否有编译器警告检测引用被复制而非引用赋值?
VS2013能否检测
auto意外将引用转为拷贝的问题? 很遗憾,Visual Studio 2013并没有专门的编译器警告能直接揪出这种场景——就是当你把原本接收引用的代码Foo & foo = DoSomething();改成auto foo = DoSomething();,而DoSomething()返回的是Foo&时,auto会默认推导成Foo类型,导致变量被拷贝而非引用绑定,这种行为在VS2013的编译器看来是合法的,不会主动发出警告。
为什么会这样?
auto的推导规则里,当表达式是左值引用时,它会自动忽略引用修饰符,直接推导为被引用的原始类型。所以DoSomething()返回Foo&,auto foo就会被推导成Foo,进而触发拷贝构造函数或赋值操作,这在语法上完全合规,编译器不会认为这是错误。
关于补救方案的补充
你们已经通过代码差异复查排查同类问题,这在旧编译器环境下是非常务实有效的办法。另外也可以考虑这些辅助措施:
- 制定团队代码规范:明确要求当函数返回引用时,接收变量必须显式使用
auto&,杜绝用裸auto接收引用返回值的情况,从源头避免误用。 - 如果后续有编译器升级计划,VS2017及以上版本开启
/W4警告等级后,会有更多针对引用和auto推导的相关警告,能更早发现这类问题。 - 借助静态代码分析工具:VS2013自带的代码分析模块,或者第三方静态检查工具,往往能识别出这种“预期引用却实际拷贝”的异常模式,补充编译器警告的不足。
内容的提问来源于stack exchange,提问作者bradgonesurfing
相关产品推荐
相关产品推荐

