static_assert 和英特尔 C++ 编译器
static_assert and Intel C++ compiler
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" 错误并指向 maxAlignment
在 [=15 中的调用=]).
但 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 在 模板 class 正文中时,它可以处理 static_assert
)
但是以下代码被两个编译器成功编译(static_assert
在 class 主体之外;它出现在块范围内):
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 函数在完全定义之前不能使用,并且 class-member constexpr 函数在 class 定义之前是未定义的,这意味着你可以' t 在 class-scope static_assert
内使用 constexpr 成员函数,它定义了这个函数。
但是你可以让这个函数独立(无论如何它已经是静态的)并且它会完成这项工作。它应该到处编译。
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" 错误并指向 maxAlignment
在 [=15 中的调用=]).
但 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 在 模板 class 正文中时,它可以处理 static_assert
)
但是以下代码被两个编译器成功编译(static_assert
在 class 主体之外;它出现在块范围内):
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 函数在完全定义之前不能使用,并且 class-member constexpr 函数在 class 定义之前是未定义的,这意味着你可以' t 在 class-scope static_assert
内使用 constexpr 成员函数,它定义了这个函数。
但是你可以让这个函数独立(无论如何它已经是静态的)并且它会完成这项工作。它应该到处编译。