与static_assert和boost :: hana

时间:2017-06-04 15:31:37

标签: c++ clang++ static-assert 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");
        });
    });
}

现在我收到了一堆编译错误,说

  

错误:引用封闭lambda表达式

中声明的局部变量i

问题:导致第二个版本失败的原因是什么?

编辑:这可能是编译器错误吗?我发现在i之前访问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) {
            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

1 个答案:

答案 0 :(得分:1)

这是Clang编译器中的一个错误,因此被承认。以下是指向它的链接:https://bugs.llvm.org/show_bug.cgi?id=33318