gpt4 book ai didi

C++11:std::move() 调用参数列表

转载 作者:搜寻专家 更新时间:2023-10-31 00:34:53 24 4
gpt4 key购买 nike

对参数列表中的对象进行操作是否安全,同时还对该对象调用了 std::move() ?

void foo(int* raw, std::unique_ptr<int> u)
{
*raw = 456;
}

std::unique_ptr<int> p(new int(123));
foo(p.get(), std::move(p));

如果 std::move(p) 被评估为第一个参数,foo() 中的“原始”指针是否有效?

最佳答案

不,它安全。参数的评估顺序在标准中指定。所以您的代码可以运行为:

  1. std::move(p) .
  2. 调用std::unique_ptr<int>的 move 构造函数.
  3. p.get() (因为 2.,这将是 nullptr。)并传递此参数。
  4. 调用foo .

你必须这样做:

int *raw = p.get();
foo(raw, std::move(p));

<我>请注意,您的代码可以正常运行,因为某些编译器可以将您的代码编译为 3 -> 1 -> 2 -> 4。但是,这并不意味着代码是安全的。没有指定标准>o<

关于C++11:std::move() 调用参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25180339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com