移动 std::vector 的构造函数

问题描述 投票:0回答:1

我发现了一个有趣的问题,但我不确定原因。这是我的代码:

#include<vector>
#include<iostream>
using namespace std;


std::vector<int>&& fun_1()
{
    std::vector<int> v{ 1, 2, 3 };
    return std::move(v);
}

std::vector<int>&& fun_2()
{
    std::vector<int> v(3, 2);
    return std::move(v);
}

int main() {
    //std::vector<int> v1 = fun_1();
    std::vector<int> v2 = fun_2(); //why isn't move-constructor called? 
    //out << v1.data() << endl;//0x00
    cout << v2.data() << endl;//0x00
}

我有两个问题。

首先,为什么 v1.data() 和 v2.data() 都返回零指针?我原本期望调用 std::vector 的移动构造函数,但似乎没有调用。

其次,当我取消主函数中第一行的注释时,函数退出时会引发内存错误。它似乎是在删除与 v1 相关的某些对象时发生的。我正在 Visual Studio 2022 环境中工作。

有人可以向我解释这两个问题吗?

c++ move stdvector
1个回答
0
投票

fun_1
fun_2
中,您都将 悬空引用 返回到局部变量。

取消引用它会调用 UB(未定义的行为)。这意味着该标准不保证程序的行为。

如果您启用编译器警告,您的编译器应该就此向您发出警告。

MSVC 问题:

warning C4172: returning address of local variable or temporary : v

海湾合作委员会问题:

warning: reference to local variable 'v' returned

叮当声问题:

warning: reference to stack memory associated with local variable 'v' returned

现场演示

© www.soinside.com 2019 - 2024. All rights reserved.