VS2013 has_nothrow_constructor带有受保护的构造函数

时间:2016-02-11 16:04:25

标签: c++ templates c++11 visual-studio-2013 stl

使用VS2013,has_nothrow_constructor和has_nothrow_default_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."

使用模板时,这会成为一个问题,我希望基本上测试一个基类构造函数的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>

提前致谢。

1 个答案:

答案 0 :(得分:0)

  

是否有一个检查没有将构造函数的可见性纳入等式?

不,没有。 它在VS2010 / 2012中运行的事实可能是一个错误。

has_nothrow_constructorhas_nothrow_default_constructor是tr1(大约2006年)的遗物。已标准化的功能是is_nothrow_constructibleis_nothrow_default_constructible。你应该使用那些 - 但他们不会给你不同的答案;他们只会让你的代码更便携。

这些都不涉及非公共建设者。因为构造函数不可访问,所以检查返回false。该类型不是默认的可构造std::is_default_constructible< BlockCopyableClass>::valuefalse,因此它不能不是默认的可构造的。