对于VS2013,has_nothrow_constructor和has_nothrow_default_constructor更严格地遵循这个标准。它现在指出:
当使用模板时,这就成了一个小问题,我想在模板中测试baseclass构造函数的抛出能力,在那里它可能会受到保护。例如:
namespace
{
class CMyBase
{
protected:
CMyBase() throw(){};
};
template < typename BlockCopyableClass >
class TestBlockCopyableBase : public BlockCopyableClass
{
protected:
TestBlockCopyableBase() throw(){}
~TestBlockCopyableBase() throw(){}
private:
static_assert((std::has_nothrow_constructor< BlockCopyableClass >::value), "BlockCopyableBase classes must have nothrow c-tors");
static_assert((std::has_nothrow_default_constructor< BlockCopyableClass >::value), "BlockCopyableBase classes must have no throw default c-tors");
};
class MyBlockCopyable : public TestBlockCopyableBase< CMyBase >
{
};
}这将在on 2012/on 2010上工作,但是对于VS2013,它返回false。是否有不考虑构造函数可见性的检查?
附加注释:有大量的CMyBase类型类,因此对这些类的修改将非常耗时(跨多个团队),而且代码仍然需要在VS2010上编译。
提前谢谢。
发布于 2016-02-11 18:57:38
是否有不考虑构造函数可见性的检查?
不,没有。它在it 2010/2012中工作的事实可能是一个缺陷。
has_nothrow_constructor和has_nothrow_default_constructor是tr1的遗物(约2006年)。已经标准化的特性是is_nothrow_constructible和is_nothrow_default_constructible。您可能应该使用这些--但它们不会给出不同的答案;它们只会使您的代码更易于移植。
这两种方法都不涉及非公共建筑工人。因为构造函数不可访问,所以检查返回false。类型不是默认的可构造的std::is_default_constructible< BlockCopyableClass>::value是false,因此不能抛出默认的可构造的。
https://stackoverflow.com/questions/35344188
复制相似问题