gpt4 book ai didi

c++ - 带有写时复制分支的 std::forward

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:52:17 25 4
gpt4 key购买 nike

我正在尝试做一些事情

template <typename T>
void somemethod (T&& t) {
foo(static_cast<const T&>(t));
bar(std::forward<T>(t));
}

这样

  1. 如果 foo()t 进行更改,它会在拷贝上运行。 (类似于写时复制)

  2. 一旦 foo()t 完成,t 将直接转发给 bar()

这可能吗?写的对吗?编译器会理解我要做什么吗?

我是否需要创建一些辅助类来实现它?

同样,如果我正在尝试达到以下效果怎么办:

template <typename T>
void somemethod (T&& t) {
foo(std::forward<T>(t));
bar(std::forward<T>(t));
}

这样

  1. foo() 使用的相同 t 然后转发给 bar()

最佳答案

写时复制是一个类的属性,没有什么好的方法可以在 somemethod 中实现它。您可以防止 foo 意外修改参数,方法是给它一个 const 参数,您正在这样做,但您也传递了它作为右值,这是不必要的,而且很奇怪。我从未见过 const T&& 的用例。人们要么使用 const T&,要么使用 T&,要么使用 T&&。对于您的情况,我会推荐 const T&

template<class T> //I'm assuming you forgot to paste this bit
void somemethod (T&& t) {
foo(static_cast<const T&>(t));
bar(std::forward<T>(t));
}

如果您真的想绝对确定 foo 在任何情况下都不会破坏 t,您可以给它一份 t 而不是 const 引用,但这对于任何理智的情况来说都太过分了。

关于c++ - 带有写时复制分支的 std::forward,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26345865/

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