C++ 警告:正在忽略模板参数上的属性。。。在std::unique_ptr(-Wignored属性)的声明中

C++ 警告:正在忽略模板参数上的属性。。。在std::unique_ptr(-Wignored属性)的声明中,c++,posix,unique-ptr,gcc-warning,c++14,C++,Posix,Unique Ptr,Gcc Warning,C++14,使用下面解释的模式: auto action = std::unique_ptr< posix_spawn_file_actions_t, decltype(&posix_spawn_file_actions_destroy) > { new posix_spawn_file_actions_t(), posix_spawn_file_actions_destroy }; 为什么呢?应该忽略它还是有办法调整代码?这表示您忽略了函数指针不抛出的事实 您的代码还存在

使用下面解释的模式:

auto action = 
  std::unique_ptr< posix_spawn_file_actions_t, decltype(&posix_spawn_file_actions_destroy) > 
  { new posix_spawn_file_actions_t(), posix_spawn_file_actions_destroy };

为什么呢?应该忽略它还是有办法调整代码?

这表示您忽略了函数指针不抛出的事实

您的代码还存在其他错误,例如更新未被delete清除的指针

或者以后我用

template<auto x> using kval_t=std::intergral_constant<std::decay_t<decltype(x)>,x>;
template<auto x> constexpr kval_t<x> kval={};
使用kval\u t=std::integral\u常量的模板;
模板constexpr kval_t kval={};
然后你可以:

auto action = 
  std::unique_ptr< posix_spawn_file_actions_t, kval_t<posix_spawn_file_actions_destroy> >  =
     { new posix_spawn_file_actions_t() };
自动操作=
std::unique_ptr=
{new posix_spawn_file_actions_t()};
但是
new
这里可能是创建
posix\u spawn\u文件\u actions\t
的错误方法


这将函数指针存储在编译时常量中,并且可能会消除该警告。

Ok,根据
posix\u spawn\u file\u actions\u destroy
可以作用于分配的堆栈地址
posix\u spawn\u file\u actions\u
。然后,我可能应该完全摆脱
unique\u ptr
,尽管不调用
posix\u spawn\u file\u actions\u destroy
的可能性仍然存在。。。啊,我讨厌当C在C++@dario中混合时,你想要一个可空的句柄,就像你想要避免堆分配一样。谢谢,我想我真的不需要它。C接口通常提供一个返回分配的指针的函数,并在完成时提供另一个释放指针的函数。我喜欢将这两个函数封装在一个智能指针中,但是我没有注意到这些posix函数有点不同。
auto action = 
  std::unique_ptr< posix_spawn_file_actions_t, kval_t<posix_spawn_file_actions_destroy> >  =
     { new posix_spawn_file_actions_t() };