Hem 5.0 ve çınlama 3.6 aşağıdaki örnekte typename
anahtar kelime gerektirir gcc:Bir atma veya silme ifadesi hiç bağımlı olabilir mi?
template<typename T>
struct B
{
typedef int Type;
};
template<int n>
struct A
{
typedef typename B<decltype(throw (int*)n)>::Type Throw;
typedef typename B<decltype(delete (int*)n)>::Type Delete;
};
Bu, C++ 11 standardında, aşağıdaki ifadeler ile kaplanmıştır:
[hariç]/2
Atama ifadesi, void türüdür.
[expr.delete]/1
işlenen türü nesne için bir işaretçi veya türü nesne için bir işaretçi olmayan tek bir açık dönüşüm fonksiyonu olan bir sınıf tipi olacaktır. Sonuçta void var.
Bu nedenle, her iki durumda da ürününün void
ürettiğini varsayıyorum. bu, potansiyel olarak değerlendirildi alt ifade
yeni ifade olarak aşağıdakilerden biri içermediği sürece
[expr.const]/2
bir koşullu ifade çekirdek sabit ifadesidir
bir atış ifade
throw
veya
delete
'u içeren bir ifadenin, sabit bir ifade olamayacağını belirtir. Bu,Bu
şablon adı bir şablon parametresi olan veya daha basit bir şablon kimliği ise
[temp.dep.type]/8
A tipi bağlıdır şablonun herhangi argümanlar bağımlı tip veya ekspresyon tip-depende olan
decltype(expression)
ile gösterilen tip bağımlı veya değer bağımlıolduğunu ifade nt
Yani B<decltype(..)>
ifadesi yazın bağımlı olması durumunda bağlıdır.
[temp.dep.Aşağıdaki formları ifade]/4
İfadeler tip bağımlı asla (ifade tipe göre olamaz çünkü):
Bu durum, ne sentezleme türü bağımlı olabileceğini düşündürmektedirdelete cast-expression
throw assignment-expression
.
Gcc ve clang ikisi de yanlış mı?
[temp.dep.constexpr]/p1 ile ilgili nedenleriniz doğru değil. Bir "reinterpret_cast", sabit bir ifadede görünemez, ancak [temp.dep.constexpr]/p3, bir "reinterpret_cast" içeren bir ifadenin muhtemelen değere bağımlı olabileceğini açıkça belirtir. –
'decltype (..)' bir ifade değil. Bu yüzden, [temp.dep.type] /9.8'e de ihtiyacınız var. Bu paragraf sadece 'throw' ve' new' için iyi tanımlanmış * tip bağımlı * olmamak için 'decltype (expression)' ifadesini gerektirir. – dyp
@dyp Evet! Bu kesin gibi görünüyor. – willj