2016-02-11 2 views
0

С VS2013 has_nothrow_constructor и has_nothrow_default_constructor следуют стандарту более внимательно. Теперь говорится, что:VS2013 has_nothrow_constructor с защищенным конструктором

> N3797 20.10.4.3 [meta.unary.prop] says that is_nothrow_default_constructible is equivalent to is_nothrow_constructible. Then it says that is_nothrow_constructible requires is_constructible to be true (and additionally the construction must be "known not to throw any exceptions"). Finally, /6 defines is_constructible in terms of "T t(create()...);" being well-formed, and says that "Access checking is performed as if in a context unrelated to T and any of the Args."

Это становится немного проблем при работе с шаблоном, где я хочу, чтобы в основном проверить возможность заброса конструктора 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.

Заранее спасибо.

+0

Я бы предложил проверить 'noexcept (BlockCopyableClass())', но VS2013 не поддерживает его: / –

ответ

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, поэтому он не может быть конструктивным по умолчанию.

Смежные вопросы