gpt4 book ai didi

c++ - unique_ptr 和默认可构造指针

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

最近我试图通过 std::unique_ptr reshape 作用域守卫 (注意:Deleter 具有成员类型定义 pointer — 是 std::unique_ptr 的特殊处理情况):

#include <type_traits>
#include <utility>
#include <memory>
#include <iostream>

#include <cstdlib>
#include <cassert>

namespace
{

template< typename lambda >
auto
make_scope_guard(lambda && _lambda)
{
struct lambda_caller
{

using pointer = std::decay_t< lambda >;

void
operator () (lambda & l) const noexcept
{
std::forward< lambda >(l)();
}

};
return std::unique_ptr< std::decay_t< lambda >, lambda_caller >(std::forward< lambda >(_lambda));
}

}

int
main()
{
std::cout << 1 << std::endl;
{
std::cout << 2 << std::endl;
[[gnu::unused]] auto && guard_ = make_scope_guard([&] { std::cout << __PRETTY_FUNCTION__ << std::endl; });
std::cout << 3 << std::endl;
}
std::cout << 5 << std::endl;
return EXIT_SUCCESS;
}

这种方法适用于指向自由函数的简单指针 void f() { std::cout << 4 << std::endl; }传递给 make_scope_guard , 但不是传递给 make_scope_guard 的任何 lambda .

这是由于大量的 ... = pointer()进入std::unique_ptr定义(函数默认参数、默认数据成员等),但我找不到 pointerDefaultConstructible 要求|进入这个article .

pointer 是强制性的吗?应该匹配 std::is_default_constructible要求?

它针对 libc++ 进行了测试反对libstdc++使用不太旧clang++ -std=gnu++1z .

看来,lambdas 应该有语言扩展:if auto l = [/* possible capture list */] (Args...) { /* code */; };然后 using L = decltype(l);相当于struct L { constexpr void operator () (Args...) const noexcept { ; } };对于一些 Args... ,不是吗?

附加:

提供实例D{}跟随 DefaultConstructible 类到 make_scope_guard(D{})要求注释掉的代码在上下文中取消注释 if (p) { ... , 其中p类型为 D :

struct D { void operator () () const noexcept { std::cout << __PRETTY_FUNCTION__ << std::endl; } /* constexpr operator bool () const { return true; } */ };

最佳答案

unique_ptr 仍然是一个指针。你不能硬塞进一个 lambda。来自 [unique.ptr]:

A unique pointer is an object that owns another object and manages that other object through a pointer. More precisely, a unique pointer is an object u that stores a pointer to a second object p and will dispose of p when u is itself destroyed

[...]

Additionally, u can, upon request, transfer ownership to another unique pointer u2. Upon completion of such a transfer, the following post-conditions hold: [...] u.p is equal to nullptr

lambda 不是指针。 lambda 不能等于 nullptr

也就是说,您已经在创建自己的本地结构,为什么不直接使用 that 来保护自身的 RAII 作用域,而不是推迟到 unique_ptr?这看起来充其量只是一个 hack,需要更多的代码才能启动。你可以改为:

template< typename lambda >
auto
make_scope_guard(lambda && _lambda)
{
struct lambda_caller
{
lambda _lambda;

~lambda_caller()
{
_lambda();
}

};

return lambda_caller{std::forward<lambda>(_lambda)};
}

如果你需要支持release,你可以将_lambda包裹在boost::optional里面,这样lambda_caller 变成:

struct lambda_caller
{
boost::optional<lambda> _lambda;

~lambda_caller()
{
if (_lambda) {
(*_lambda)();
_lambda = boost::none;
}
}

void release() {
_lambda = boost::none;
}
};

关于c++ - unique_ptr 和默认可构造指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31749700/

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