使用VS2013,has_nothrow_constructor和has_nothrow_default_constructor更紧密地遵循标准。它现在声明:
使用模板时,这会成为一个问题,我希望基本上测试一个基类构造函数的throw功能,它可能受到保护。例如:
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 >
{
};
}
这适用于VS2012 / VS2010但是VS2013会返回false。是否有一个检查,没有建设者可见的方程式?
其他评论:有大量CMyBase
类型类,因此对这些类型的修改将非常耗时(跨多个团队),并且代码仍需要在VS2010上进行编译。 / p>
提前致谢。
答案 0 :(得分:0)
是否有一个检查没有将构造函数的可见性纳入等式?
不,没有。 它在VS2010 / 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
,因此它不能不是默认的可构造的。