c++ - 立即传递其成员时的右值范围

标签 c++ pointers scope lifetime temporary

右值何时失效/被视为未定义?

下面是两个示例,其中一个将右值存储在局部变量中,然后对该局部变量执行操作,另一个示例显示将右值的成员立即传递给也对数据进行操作的函数.

我怀疑示例 1 是未定义的行为,就像在我自己​​的代码中一样(这是一个最小的可重现示例),应用程序完全失败,而 2 则没有。 2 也是未定义的行为吗?以下是哪些示例?

struct container {
    int data[5];
    container(int a) {
        data[0] = a;
    }
};

void main() {
    int* arr = container(123).data;

    // ... do stuff with data
}

对比

struct container {
    int data[5];
    container(int a) {
        data[0] = a;
    }
};

void do_stuff_with_data(int* data) {
    // ... do stuff with data
}
void main() {
    do_stuff_with_data(container(123).data);
}

最佳答案

第二个结构良好。 Temporaries完整表达后将被销毁。

All temporary objects are destroyed as the last step in evaluating the full-expression that (lexically) contains the point where they were created, ...

给定 do_stuff_with_data(container(123).data);,临时对象(即 container(123))将在完整表达式之后被销毁,其中包含调用do_stuff_with_data

另一方面,第一个可能有未定义的行为。完整表达式完成后,临时对象已被销毁,并且 arr 变为悬挂状态。稍后对其进行任何取消引用都会导致 UB。

关于c++ - 立即传递其成员时的右值范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59125219/

相关文章:

c - 如何在 C 中引用与全局变量同名的局部变量?

c++ - 给定一个元素的地址搜索二维数组

c# - 如何使用CreateExternalTexture和从C++库传递的指针创建Texture2D?

python - 为什么在我排除之后不能调用异常?

javascript闭包局部变量超出范围?

c++ - 该指针不同于调用该方法的指针

c++ - GetDIBits() 因 PNG 压缩而失败

C++:获取传递给函数的多维数组的行大小

c++ - C++中 "resizing"数组访问冲突

c# - 你能理解这段 C 指针代码吗?