在尝试检查一个类是否来自另一个类时,我遇到了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)可以(并且!)不同的事实是非常奇怪的。
答案 0 :(得分:1)
IntelliSense错误地将它们标记为失败,但如果您尝试构建项目,它将成功编译。
Intellisense不是一个功能齐全的编译器,它可能不准确或可能不会更新以支持最新的语言功能,有时也不同意编译器。