【发布时间】:2016-05-22 12:22:47
【问题描述】:
在 VS2013 中,has_nothrow_constructor 和 has_nothrow_default_constructor 更接近标准。它现在声明:
在使用模板时,这会成为一个问题,我想基本上测试基类构造函数的抛出能力,它可能受到保护。例如:
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 上编译。
提前致谢。
【问题讨论】:
-
我会建议检查
noexcept(BlockCopyableClass()),但VS2013不支持它:/
标签: c++ templates c++11 visual-studio-2013 stl