2017-12-19 120 views
8

Aşağıdaki C++ 11 kodunu karışık sonuçlarla derlemeye çalıştım.Şube içindeki lamdada sürekli ifadeden alınmadı: Kim haklı?

struct NoTemplate { 
    static constexpr auto (*foo)() = false ? +[]{} : nullptr; 
}; 

NoTemplate no_inst; 


template<typename> 
struct YesTemplate { 
    static constexpr auto (*foo)() = false ? +[]{} : nullptr; 
}; 

YesTemplate<float> yes_inst; 
  • çınlama: başarıyla NoTemplate hazırlar, error: a lambda expression may not appear inside of a constant expression, YesTemplate numaralı telefondan verir.
  • gcc: Her ikisi de başarıyla derler
  • msvc: Kilitleniyor.
  • icc: Kazalar (işte kazanan!)

doğru sonucu nedir? Sabit olmayan ifadelerin, sabit ifadelerdeki kısa devre operatörlerinin yanlış dalında Tamam olması gerektiğini söyleyen standart bir dil görüyorum, fakat IANALL.

+3

Çökmeler ile derleyici çöker mi, yoksa program çöküyor mu? – user4581301

+0

En son VC'de (19.12.something) C++ 17'ye ayarlanmış ve 4. seviyeye ayarlanmış uyarılar ile belirsiz operatöre '+' işareti veririm – SoronelHaetir

+2

Clang hatası gibi görünüyor, clang HEAD bir tanılama sağlamaz [bkz. ive] (https://wandbox.org/permlink/2I7TE8WOTzZvmeZC) dili [koşullu durumun değerlendirilmemiş bölümünde lambdaları destekler] (https://stackoverflow.com/q/22232164/1708801) –

cevap

0

Bu program iyi biçimlendirilmiştir.

C++ 17'den sonra not alınsa bile, bir lambda ifadesi bir çekirdek sabit ifadesinde kabul edilebilir. Detaylı bilgi için önerilen kağıdı N4487 görebilirsiniz.

İlgili konular