gpt4 book ai didi

c++ - static_assert 和英特尔 C++ 编译器

转载 作者:可可西里 更新时间:2023-11-01 17:59:14 25 4
gpt4 key购买 nike

阅读 cppreference.com :

A static assert declaration may appear at block scope (as a block declaration) and inside a class body (as a member declaration)

好的,现在我有以下代码:

struct foo_t
{
static constexpr std::size_t maxAlignment()
{
// This is just a sample; I removed real code from this method.
return std::max(alignof(__m128), __alignof(__m256));
}

static_assert(0 == ((maxAlignment() -1) & maxAlignment()), "some message");
};

MSVC 2015 和 Intel C++ 16.0.2 都无法编译此代码(前者显示“error C2131: expression did not evaluate to constant”,后者显示“function call must have a constant value in a constant expression”错误并指出在 static_assert 中调用 maxAlignment

但 MSVC 2015 Update 1编译以下代码,而 Intel C++ 16.0.2 不会:

template <typename T, std::size_t Alignment>
struct foo_t
{
static constexpr std::size_t maxAlignment()
{
return std::max(std::alignment_of<T>::value, Alignment);
}

static_assert(0 == ((maxAlignment() -1) & maxAlignment()), "some message");
};

foo_t<__m128, 16> foo {};
// foo_t<__m128, 33> boo {}; // here `static_assert` will stop compilation

(因此,MSVC 可以在 template 类主体中处理 static_assert)

但是下面的代码被两个编译器编译成功(static_assert 在类主体之外;它出现在 block 范围内):

struct foo_t
{
static constexpr std::size_t maxAlignment()
{
return std::max(alignof(__m128), __alignof(__m256));
}
};

static_assert(0 == ((foo_t::maxAlignment() -1) & foo_t::maxAlignment()), "some message");

我的问题是:我是不是遗漏了什么或者是英特尔 C++ 编译器的错误?

最佳答案

如果我没记错的话,constexpr 函数在完全定义之前不能使用,类成员 constexpr 函数在类定义之前是未定义的,这意味着您不能在类中使用 constexpr 成员函数- scope static_assert 定义了这个函数。

但是你可以让这个函数独立(无论如何它已经是静态的)并且它会完成工作。它应该在任何地方编译。

关于c++ - static_assert 和英特尔 C++ 编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35764069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com