2014-09-25 18 views
10

std::reference_wrapper<T>, T 'un T olmadan tamamıyla aynı şekilde tamamlanmasını sağlıyor mu?Bir std :: reference_wrapper <T>'u başlatabilir miyim, T tamamlanmamış bir türüdür?

#include <functional> 

struct woof; 

struct test 
{ 
    test(woof& w) : w(w) {} 
    std::reference_wrapper<woof> w; 
}; 

struct woof 
{ 
    int a; 
}; 

int main() 
{ 
    woof w; 
    test t = w; // (braced-init would be better, but VS2012!) 
} 

Ama MSVS 2012 aşağıdaki iletiyle bunu reddeder:

Hata 1 hata C2139: 'atkı': tanımlanmamış bir sınıfı bir şekilde izin verilmez

GCC 4.9 Aşağıdaki kabul bağımsız değişken c '__is_abstract' intrinsik tip özelliği derleyici için: \ Program Files (x 86) \ microsoft Visual Studio 11.0 \ vc \ \ 755 1 Test3

I type_traits içerir Bunun nedeni, op()'un tam tür olması gerektiğinden şüphelenir, ancak iki yol belirtmek için standart görünmez görünür.

Bu uygulamalardan hangisi standart yönergeleri uyguluyorsa?

+2

Hiç bir fikrim yok ama MS –

+1

numaralı yazımda yok MSVC, standardın ne yazdığına bakılmaksızın başarısız olduğunu unutmayın: [Bu program] (http://coliru.stacked-crooked.com/a/5a8e28dc279da2e5) 'is_abstract' testi sayesinde MSVC11 + 'yı derleyin. – Xeo

cevap

14

N3936 § 17.6.4.8 Diğer fonksiyonlar [res.on.functions]: Bazı durumlarda

1 (yedek fonksiyonları, işleyici fonksiyonları standart kütüphane şablon bileşenlerini oluşturmak için kullanılır tipleri üzerindeki operasyonlar), C++ standart kitaplığı bir C++ programı tarafından sağlanan bileşenlere bağlıdır. Bu bileşenler gereksinimlerini karşılamıyorsa, Standart, uygulama ile ilgili hiçbir gereklilik getirmez.

2 Özellikle, etkiler aşağıdaki durumlarda tanımlanmamıştır:

  • ...
  • şablon bileşeni başlatmasını tamamlanmamış tipi (3.9) ve bir model bağımsız değişken olarak kullanıldığı takdirde, sürece Özellikle bu bileşen için izin verilir.

20.9.3 Sınıf şablonunda reference_wrapper [refwrap] aracılığıyla hızlı tarama reference_wrapper için böyle spesifik istisna, bu nedenle programı tanımlanmamış olan davranış ortaya koymaktadır. Her iki uygulama da uyumludur.

+1

Lanet, çok yavaş. +1 BTW: Bu, eksik bir türün izin verilmesi gereken bir durum olduğunu düşünüyorum. – Deduplicator

+0

Bu özel istisna olan tek bileşenlerin akıllı işaretçi türleri olduğu görülüyor. Ben de 'reference_wrapper' için çok fazla mantıklı olacağını düşünüyorum, çünkü bu yararlı olabilir ve önemsizdir (çünkü akıllı işaretçiler gibi bir işaretçinin etrafında sadece bir sarıcı olduğu için). Tamamlanmamış türden bir soru, C++ standardında (kütüphane bileşenleri ve şablonlarla ilgili kurallar için) çok zayıf bir noktadır, daha açık kurallar ve UB yerine gerekli teşhis/hatalar gibi daha iyi özelliklere ihtiyaç duymaktadır. –

+5

@Deduplicator Eksik türlere izin verme ile ilgili sorun, 'reference_wrapper' işlevinin geriye dönük uyumluluk için eski 'unary_function' /' binary_function' protokolüne uyması gerektiğidir.Bunu yapmak için, şablon parametresinin tipine, ör. [refwrap]/3: "Şablon eşgörünümü ..." T1 "için eşanlamlısı olarak ... argüman_type'ını tanımlayacaktır, yalnızca" T "türü aşağıdakilerden biri ise: ... "argüman_type" türünde bir üye türü, "T1" türü "T :: argument_type" şeklindedir. – Casey

İlgili konular