С VS2013 has_nothrow_constructor и has_nothrow_default_constructor следуют стандарту более внимательно. Теперь говорится, что:VS2013 has_nothrow_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>
{
};
}
Это будет работать на VS2012/VS2010, но с VS2013 она возвращает ложь. Есть ли проверка, которая не принимает видимость конструктора в уравнение?
Дополнительные комментарии: Есть ТОННЫ CMyBase
классов типа так модификации тех, будут очень много времени (на нескольких команд), а код все равно нужно собрать на VS2010.
Заранее спасибо.
Я бы предложил проверить 'noexcept (BlockCopyableClass())', но VS2013 не поддерживает его: / –