Visual Studio中的嵌套模板的一致性模式和多重继承

时间:2018-06-14 20:39:41

标签: visual-c++ namespaces multiple-inheritance

在尝试检查一个类是否来自另一个类时,我遇到了Visual Studio的奇怪行为(在我看来)。请考虑以下示例:

示例1

namespace X
{
    namespace Y
    {
        struct A {};
        struct B {};
    }
}

struct AB : public X::Y::A, public X::Y::B {};

static_assert(std::is_base_of_v<X::Y::A, AB>); // (1)
static_assert(std::is_base_of_v<X::Y::B, AB>); // (2)

示例2

namespace X
{
    namespace Y
    {
        struct A {};
        struct B {};
    }
}

using namespace X::Y;
struct AB : public A, public B {};

static_assert(std::is_base_of_v<A, AB>); // (3)
static_assert(std::is_base_of_v<B, AB>); // (4)

我在Visual Studio中添加了/std:c++latest选项,因此根据我的理解,嵌套命名空间应该没问题。

如果我将Visual Studio中的Conformance Mode设置为,则上述所有static_assert个表达式都会得到满足。

但是,如果我将其设置为(即/permissive-),则满足(3)但所有(1),(2)和(4)都失败。我很欣赏任何人可以提出的任何见解,为什么会出现这种情况 - 这是我的错误理解,还是VS问题?特别是,(3)和(4)可以(并且!)不同的事实是非常奇怪的。

1 个答案:

答案 0 :(得分:1)

IntelliSense错误地将它们标记为失败,但如果您尝试构建项目,它将成功编译。

Intellisense不是一个功能齐全的编译器,它可能不准确或可能不会更新以支持最新的语言功能,有时也不同意编译器。