2017-06-04 46 views
5

-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ı.

+0

@aschepler: Özür dilerim - Senin noktanı anlamıyorum. Detaylandırır mısın? – LocalVolatility

+1

"this" benzer bir https://stackoverflow.com/questions/43665610/why-is-this-nested-lambda-not-considered-constexpr –

+1

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. –

cevap