Разрешает ли std::reference_wrapper<T>
T
быть неполным, так же, как a T&
можно обрабатывать без завершения T
?
GCC 4.9 принимает следующее:
#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!)
}
Но MSVS 2012 отклоняет его со следующим сообщением:
Ошибка 1 ошибка C2139: 'woof': класс undefined не разрешен в качестве аргумента для атрибута встроенного типа компилятора '__is_abstract' c:\program files (x86)\microsoft visual studio 11.0\vc\include\type_traits 755 1 тест3
Я подозреваю, что это потому, что op()
нужен полный тип, но стандарт не указывает на какой-либо способ.
Что, если любая из этих реализаций соответствует стандартным мандатам?