Czy std::reference_wrapper<T>
może być niekompletne, tak jakby można było załatwić bez zakończenia?Czy można utworzyć instancję std :: reference_wrapper <T> gdzie T jest niekompletnym typem?
GCC 4.9 akceptuje następujące:
#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!)
}
Ale MSVS 2012 odrzuca go z następującym komunikatem:
Error 1 error C2139: 'hau': niezdefiniowany klasa nie jest dozwolony jako Argument typu kompilator wewnętrzną cechę '__is_abstract' c: \ program files (x86) \ Microsoft visual studio 11.0 \ VC \ include \ type_traits 755 1 test3
I podejrzewasz, że jest tak, ponieważ op()
potrzebuje pełnego typu, ale standard nie wyświetla jako, aby określić którykolwiek sposób.
Które z tych implementacji spełnia standardowe mandaty?
Nie mam pojęcia, ale mój zakład nie jest na MS –
Należy zauważyć, że MSVC nie działa niezależnie od tego, co standard mówi: [Ten program] (http://coliru.stacked-crooked.com/a/5a8e28dc279da2e5) doesn ' t kompilacja na MSVC11 +, dzięki testowi 'is_abstract'. – Xeo