与 static_assert 和 boost::hana 相关的 Clang 编译错误
Clang compile error related to static_assert and boost::hana
考虑以下使用 -std=c++14
.
在 Clang 3.8 上成功编译的问题
#include <boost/hana.hpp>
namespace hana = boost::hana;
int main() {
constexpr auto indices = hana::range<unsigned, 0, 3>();
hana::for_each(indices, [&](auto i) {
hana::for_each(indices, [&](auto j) {
constexpr bool test = (i == (j == i ? j : i));
static_assert(test, "error");
});
});
}
这个测试很荒谬,但这不是重点。现在考虑一个替代版本,其中测试直接放在 static_assert
:
中
#include <boost/hana.hpp>
namespace hana = boost::hana;
int main() {
constexpr auto indices = hana::range<unsigned, 0, 3>();
hana::for_each(indices, [&](auto i) {
hana::for_each(indices, [&](auto j) {
static_assert((i == (j == i ? j : i)), "error");
});
});
}
现在我得到一堆编译错误,说
error: reference to local variable i
declared in enclosing lambda expression
问:第二版失败的原因是什么?
编辑:这可能是编译器错误吗?我发现当在 static_assert
之前访问 i
时,一切都会再次编译:
#include <boost/hana.hpp>
namespace hana = boost::hana;
int main() {
constexpr auto indices = hana::range<unsigned, 0, 3>();
hana::for_each(indices, [&](auto i) {
hana::for_each(indices, [&](auto j) {
constexpr auto a = i;
static_assert((i == (j == i ? j : i)), "error");
});
});
}
更新:可以在 Clang 4.0 和当前开发分支 5.0 上重现相同的行为。
更新 2:正如@LouisDionne 所建议的,我将此作为错误提交:https://bugs.llvm.org/show_bug.cgi?id=33318.
这是 Clang 编译器中的错误,已被确认。这是它的 link:https://bugs.llvm.org/show_bug.cgi?id=33318.
考虑以下使用 -std=c++14
.
#include <boost/hana.hpp>
namespace hana = boost::hana;
int main() {
constexpr auto indices = hana::range<unsigned, 0, 3>();
hana::for_each(indices, [&](auto i) {
hana::for_each(indices, [&](auto j) {
constexpr bool test = (i == (j == i ? j : i));
static_assert(test, "error");
});
});
}
这个测试很荒谬,但这不是重点。现在考虑一个替代版本,其中测试直接放在 static_assert
:
#include <boost/hana.hpp>
namespace hana = boost::hana;
int main() {
constexpr auto indices = hana::range<unsigned, 0, 3>();
hana::for_each(indices, [&](auto i) {
hana::for_each(indices, [&](auto j) {
static_assert((i == (j == i ? j : i)), "error");
});
});
}
现在我得到一堆编译错误,说
error: reference to local variable
i
declared in enclosing lambda expression
问:第二版失败的原因是什么?
编辑:这可能是编译器错误吗?我发现当在 static_assert
之前访问 i
时,一切都会再次编译:
#include <boost/hana.hpp>
namespace hana = boost::hana;
int main() {
constexpr auto indices = hana::range<unsigned, 0, 3>();
hana::for_each(indices, [&](auto i) {
hana::for_each(indices, [&](auto j) {
constexpr auto a = i;
static_assert((i == (j == i ? j : i)), "error");
});
});
}
更新:可以在 Clang 4.0 和当前开发分支 5.0 上重现相同的行为。
更新 2:正如@LouisDionne 所建议的,我将此作为错误提交:https://bugs.llvm.org/show_bug.cgi?id=33318.
这是 Clang 编译器中的错误,已被确认。这是它的 link:https://bugs.llvm.org/show_bug.cgi?id=33318.