gpt4 book ai didi

具有复制省略或 move 语义的 C++11 元组

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:39 24 4
gpt4 key购买 nike

我写了一个如下的函数:

template <typename T>
std::tuple<std::vector<T>, T, T> f() {
std::vector<T> p(1000);
return std::make_tuple(std::move(p), 10, 10);
}

由于返回类型非常复杂,是否保证在 c++11 下编译器在构造结果时将应用复制省略或 move 语义,或者我必须明确地说出类似 std::move(std: :make_tuple(std::move(p), 10, 10))?

最佳答案

AFAIK 复制省略始终是可选的。标准只是明确表示允许编译器进行此类优化,因为它改变了可观察到的行为,它并不强制执行。特别是 12.8 p。 31:

When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class object, even if the constructor selected for the copy/move operation and/or the destructor for the object have side effects.

免责声明:这是来自社区草案 n3690 , 但 c++11 的版本即使不完全相同也有类似的声明

顺便说一句,标准就在那里指定。

然而,对于 move ,它是有保证的。您创建一个临时对象并返回它(即 std::make_tuple 返回一个 rvalue 并将其向前传递),模板的参数不会改变对 move 的支持语义。

关于具有复制省略或 move 语义的 C++11 元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31077293/

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