gpt4 book ai didi

c++ - 不可移动的 C++17 唯一指针

转载 作者:IT老高 更新时间:2023-10-28 22:03:11 24 4
gpt4 key购买 nike

我遇到了这个答案 Prevent moving of a unique_ptr C++11 .但是,在在线编译器上试用它时,这适用于 C++11(std::move 编译器错误),但对于 C++17,我看到 std: :move 下面是成功的。编译器不应该在该行抛出错误吗?此外,如果 C++17 中的某些语义发生了变化,那么在 C++17 及更高版本中创建不可移动的 unique_ptr 的正确方法是什么。

template <typename T>
using scoped_ptr = const std::unique_ptr<T>;

int main()
{
auto p = scoped_ptr<int>(new int(5));
auto p2 = std::move(p); // should be error?
std::cout << *p2 << std::endl; // 5
return 0;
}

您可以在线试用here .

最佳答案

p不是 const .见 here让它以你期望的方式失败。

auto推导如 template<class T>void foo(T)做。 T永远不会被推断为 const , auto p= 也不是.

同时,auto p =行有效,因为您在 中编译了它模式。在 it does not compile .这是因为 prvalues 在 17 中有何不同;有些人称差异为保证省略。

如果你想要一个固定的唯一指针:

template<class T, class D>
struct immobile_ptr:private std::unique_ptr<T, D>{
using unique_ptr<T>::operator*;
using unique_ptr<T>::operator->;
using unique_ptr<T>::get;
using unique_ptr<T>::operator bool;
// etc

// manually forward some ctors, as using grabs some move ctors in this case
};
template<class T, class...Args>
immobile_ptr<T> make_immobile_ptr(Args&&...args); // todo

另一种选择可能是使用固定的驱逐舰获取一个独特的ptr。

template<class X>
struct nomove_destroy:std::destroy<T>{
nomove_destroy(nomove_destroy&&)=delete;
nomove_destroy()=default;
nomove_destroy& operator=(nomove_destroy&&)=delete;
};
template<class T>
using nomove_ptr=std::unique_ptr<T,nomove_destroy<T>>;

但我不确定这是否可行。

关于c++ - 不可移动的 C++17 唯一指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53455630/

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