5

考虑以下在 Clang 3.8 上使用-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");
        });
    });
}

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

i错误:对封闭 lambda 表达式中声明的局部变量的引用

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

编辑:这可能是编译器错误吗?我发现在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 。

4

1 回答 1

1

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

于 2017-06-06T17:37:06.400 回答