gpt4 book ai didi

c++ - 检测类型何时不需要调用其析构函数

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

我正在编写一个 C++11 STL 兼容的分配器,我想知道如何检测调用它们的析构函数(在 allocator<T>::destroy 方法中)是安全的类型。 )

我已经编写了分配器(一个简单的分配器),据我所知,它确实有效。我问的原因是我在我的代码中收到警告(即在我的分配器的 destroy 方法中。)我在最高警告级别使用 VS2013 (vc12),警告是:

warning C4100: 'c' : unreferenced formal parameter

在这个方法中:

template <typename T>
class MyAlloc
{
...

template <typename C>
void destroy (C * c) // <-- this is the 'c' that the warning is referring to
{
c->~C ();
}

...
};

如您所见,警告和代码都非常简单明了。在我看来,发出警告是因为该分配器用于的某些类没有析构函数(例如,因为它们是 POD 等)。随后,编译器在上述函数中删除了对析构函数的调用正在为此类类实例化分配器,然后发现函数体为空且参数未使用,发出警告。

我在想我可以写出上面的两个版本destroy方法,使用 enable_if 重载,并在不需要销毁的类的重载中将正文留空并且参数未命名。这行得通吗?

另一方面,这个警告是一个非常小的不便。我可以禁用此特定警告,它不会对我的代码库产生太大影响。毕竟,这几乎不是一个有用的警告。

但是,如果我确实尝试更改我的代码并检测不需要销毁的类,但这样做不可靠且效果不佳,我就会为各种痛苦和苦难打开闸门。因为如果我碰巧不销毁一个确实需要销毁的类的实例,那么只有上帝知道什么会(并且会)出错!因此,如果没有 100% 可靠且稳健的方法来检测并处理此类类,我宁愿保留警告,甚至附带警告。

重申一下,我的问题分为三个部分:

  1. 我对警告原因的分析是否正确?
  2. 我如何确定何时不调用类型的析构函数是安全的。换句话说,类型的析构函数何时完全无效,我如何检测到这一点(使用类型特征等)?
  3. 此检测是否始终可靠且完全可靠?

还有一个奖励问题:

我试过这个重载只是为了看看它是否有效:

template <typename C>
std::enable_if<std::is_trivially_destructible<C>::value>
destroy (C *)
{
}

template <typename C>
std::enable_if<!std::is_trivially_destructible<C>::value>
destroy (C * c)
{
c->~C ();
}

请注意,我并不是说使用 std::is_trivially_destructible<>是要走的路;我只是想试试看是否enable_if在这种情况下工作。但是现在我遇到了很多这样的错误:

error C2668: 'MyAlloc<Whatever>::destroy' : ambiguous call to overloaded function
could be 'std::enable_if<false,void> MyAlloc<Whatever>::destroy<SomeType>(C *)'
or 'std::enable_if<true,void> MyAlloc<Whatever>::destroy<SomeType>(C *)'

似乎我在 enable_if 上做错了什么.我哪里错了?不应该 enable_if<false,...>由于 SFINAE 而被从决议中删除? SFINAE 是否也在类范围内发生?我也将感谢在这方面的任何帮助。

最佳答案

Microsoft say it's a bug ("limitation") of their compiler .

发明复杂的基于模板的解决方法是一项有趣的智力挑战,但在实际产品的代码审查中,我会比你说“过度设计”更快地抛弃任何此类东西。

template <typename C>
void destroy (C * c) // <-- this is the 'c' that the warning is referring to
{
(void)c; // shut up you stupid compiler
c->~C ();
}

关于c++ - 检测类型何时不需要调用其析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20946278/

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