gpt4 book ai didi

c++ - 铛+ libc++ : combination of make_tuple with make_shared leads to early object destruction

转载 作者:行者123 更新时间:2023-11-30 03:31:10 25 4
gpt4 key购买 nike

我几乎整天都在跟踪程序中的错误。出于某种原因,我根据 c++11 实现的 std::apply 是错误的:底层函数的参数在调用过程中以某种方式为空。一个很好的例子是 std::unique_ptr 在调用一个临时函数(下面的 foo())之后在主体中总是 empty()被调用的函数。

我已经将我的代码简化为一个简单的测试用例:

#include <tuple>
#include <memory>
#include <iostream>

struct Foo
{
Foo()
{
std::cout << "Foo()" << std::endl;
}

~Foo()
{
std::cout << "~Foo()" << std::endl;
}
};

template <typename ...Args>
void foo(Args && ...args)
{
using TupleType = decltype(std::make_tuple(std::forward<Args>(args)...));

std::cout << "Point #1" << std::endl;

/// Package arguments to a function.
auto && packaged_args = std::make_shared<TupleType>(std::make_tuple(std::forward<Args>(args)...));

std::cout << "Point #2" << std::endl;
}

int main()
{
std::unique_ptr<Foo> foo_var{new Foo};

foo(std::move(foo_var));
return 0;
}

如果用 clanglibc++ (-stdlib=libc++) 一起编译,结果是:

Foo()
Point #1
~Foo()
Point #2

coliru.stacked-crooked.com 上的实例


结果显然不正确。如果用 clang, but without libc++ 编译, 或者如果用 gcc 编译,结果符合预期:

Foo()
Point #1
Point #2
~Foo()

对于 clanglibc++ 的组合,我发现了一个可笑的解决方法,替换:

auto && packaged_args = std::make_shared<TupleType>(std::make_tuple(std::forward<Args>(args)...));

与:

std::shared_ptr<TupleType> packaged_args{new TupleType(std::make_tuple(std::forward<Args>(args)...))};

它再次按预期工作。


coliru.stacked-crooked.com 上的实例


问题是:它是一个 UB,所以两个编译器都是正确的错误代码,或者代码没问题,这是一个错误?

最佳答案

这似乎是 libc++ 的元组实现中的一个错误。

该错误存在于 Libc++ <= 3.8 中,但已通过我在 3.9 中重写的元组修复。

抱歉这个错误;避免它的最佳/唯一方法似乎是升级。

关于c++ - 铛+ libc++ : combination of make_tuple with make_shared leads to early object destruction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44397426/

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