gpt4 book ai didi

c++ - 如何使用 std::variant 保证复制省略?

转载 作者:太空狗 更新时间:2023-10-29 22:54:19 27 4
gpt4 key购买 nike

我有这种类型:

struct immobile {
// other stuff omitted
immobile(immobile&) = delete;
immobile(immobile&&) = delete;
};
immobile mk_immobile();
// e.g. this compiles
// mk_immobile() is a prvalue and i is its result object
immobile i(mk_immobile());

我也有这个类模板:

template<typename T>
struct container {
std::variant<T, other_stuff> var;
template<typename... Args>
container(Args&&... args)
: var(std::in_place_index<0>, std::forward<Args>(args)...) {}
};

我想构造一个 containermk_immobile() 产生的物体周围, 与 immobile用于初始化 var 变体之一的对象.

container<immobile> c(mk_immobile());

但是,这不起作用。对于一个,std::variant的构造函数想要 std::is_constructible_v<immobile, immobile> , 这不成立。更糟糕的是,即使是这个简化版本也会失败:

template<typename T>
struct demonstration {
T t;
template<typename... Args>
demonstration(Args&&... args) : t(std::forward<Args>(args)...) {}
};
demonstration<immobile> d(mk_immobile());

这似乎暗示 std::forward事实上,它并不完全向前——纯右值并不像纯右值那样向前。 (这对我来说很有意义;我不认为那样做是可能的。)我可以做到 demonstration通过将其更改为此来工作:

template<typename T>
struct demonstration {
T t;
template<typename F>
demonstration(F&& f) : t(std::forward<F>(f)()) {}
};
demonstration<immobile> d([] { return mk_immobile(); });

但我没有看到改变的方法container以类似的方式。如何更改 container这样它就可以构造一个std::variant (或其他标记的 union )出于纯右值?我可以改变 container但不能改变 immobile .

最佳答案

你滥用强制转换

template<typename F>
struct initializer
{
F f;
template<typename T>
operator T()
{
return f();
}
};

template<typename F>
initializer(F&&) -> initializer<F>;

并用作

container<immobile> c{initializer{[]{
return mk_immobile();
}}};

关于c++ - 如何使用 std::variant 保证复制省略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56435914/

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