我是C++编程的新手,但这个问题一直在旋转.我知道在函数中返回对局部变量的引用是非法的,即编译此代码片段:
inline int& funref() {
int a = 8;
return a; // not OK!
}
Run Code Online (Sandbox Code Playgroud)
导致编译器发出警告,然后发生运行时错误.但是,为什么这段代码在没有任何警告的情况下编译并运行没有错误?
inline int& funref() {
int a = 8;
int& refa = a;
return refa; // OK!
}
int main() {
int& refa = funref();
cout << refa;
}
Run Code Online (Sandbox Code Playgroud)
我的编译器是Linux Fedora平台上的g ++.
它仍然是错的,它恰好是通过(非)快乐的巧合来工作的.
这段代码具有未定义的行为以及所有常见的警告(它可能始终有效,它可能一直有效,直到修复为时已晚,它可能会引发你的房子并与你的未婚妻一起逃跑).
编译器不需要为每个可能的错误发出诊断(警告或错误消息),因为并不总是这样做.在这里,至少你当前版本的g ++没有警告过.不同的编译器,或不同版本的g ++,甚至是具有不同标志的相同版本,都可能会警告您.
| 归档时间: |
|
| 查看次数: |
109 次 |
| 最近记录: |