根据 Herb Sutter 的文章http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/,以下代码是正确的:
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> f() { return {{1},{2},{3},{4},{5}}; }
int main()
{
const auto& v = f();
cout << v[3][0] << endl;
}
即生命周期v
延长到v
常量引用的生命周期。事实上,根据 valgrind,这可以很好地使用 gcc 和 clang 编译并且运行时没有泄漏。
但是,当我这样更改main
功能时:
int main()
{
const auto& v = f()[3];
cout << v[0] << endl;
}
它仍然可以编译,但 valgrind 警告我在函数的第二行中读取无效,因为内存在第一行中被释放。
这是符合标准的行为还是可能是 g++ (4.7.2) 和 clang (3.5.0-1~exp1) 中的错误?
如果它符合标准,那对我来说似乎很奇怪......哦,好吧。