首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带保护构造函数的VS2013 has_nothrow_constructor

带保护构造函数的VS2013 has_nothrow_constructor
EN

Stack Overflow用户
提问于 2016-02-11 16:04:25
回答 1查看 86关注 0票数 0

对于VS2013,has_nothrow_constructor和has_nothrow_default_constructor更严格地遵循这个标准。它现在指出:

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构造函数的抛出能力,在那里它可能会受到保护。例如:

代码语言:javascript
复制
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上编译。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-02-11 18:57:38

是否有不考虑构造函数可见性的检查?

不,没有。它在it 2010/2012中工作的事实可能是一个缺陷。

has_nothrow_constructorhas_nothrow_default_constructor是tr1的遗物(约2006年)。已经标准化的特性是is_nothrow_constructibleis_nothrow_default_constructible。您可能应该使用这些--但它们不会给出不同的答案;它们只会使您的代码更易于移植。

这两种方法都不涉及非公共建筑工人。因为构造函数不可访问,所以检查返回false。类型不是默认的可构造的std::is_default_constructible< BlockCopyableClass>::valuefalse,因此不能抛出默认的可构造的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35344188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档