-std=c++14
kullanarak Clang 3.8 üzerinde başarıyla derleyen aşağıdaki sorunu göz önünde bulundurun.Clang derleme static_assert ve boost ile ilgili derleme hatası :: hana
#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");
});
});
}
Bu test oldukça hassas değil ama konu bu değil.
error: reference to local variable
i
declared in enclosing lambda expression
Soru diyerek
#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"); }); }); }
Şimdi derlemek hataların bir demet olsun: Şimdi test doğrudan static_assert
içine konur alternatif versiyonunu düşünün ne başarısız olmasına ikinci versiyonu neden olur?
Düzenleme: Bu bir derleyici hatası olabilir mi? Ben static_assert
önce i
erişirken, her şey yeniden derler çıkıyor:
#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");
});
});
}
Güncelleme: aynı davranış Clang 4.0 ve güncel gelişme dalı 5.0 üzerinde yeniden üretilebilir.
Güncelleme 2: https://bugs.llvm.org/show_bug.cgi?id=33318: @LouisDionne önerdiği gibi, ben bir hata olarak bu açtı.
@aschepler: Özür dilerim - Senin noktanı anlamıyorum. Detaylandırır mısın? – LocalVolatility
"this" benzer bir https://stackoverflow.com/questions/43665610/why-is-this-nested-lambda-not-considered-constexpr –
Bir derleyici hata olan _believe_. Bence en iyi bahisten, Clang'a karşı bir böcek yazıp oradaki bilgili insanların neler düşündüğünü görmek. –