Могу ли я создать экземпляр std :: reference_wrapper <T> где T неполный тип?

Разрешает ли std::reference_wrapper<T> T быть неполным, так же, как с 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»: неопределенный класс не допускается в качестве аргумента для свойства встроенного типа компилятора «__is_abstract» c: \ program files (x86) \ microsoft visual studio 11.0 \ vc \ include \ type_traits 755 1 test3

Я подозреваю, что это потому, что op() нужен полный тип, но стандарт не отображается указать в любом случае.

Какая из этих реализаций соответствует стандартным требованиям?

11 голосов | спросил Lightness Races in Orbit 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 25 Sep 2014 20:44:24 +0400 2014, 20:44:24

1 ответ


0

N3936 § 17.6.4.8 Другие функции [res.on.functions] :

  

1 В некоторых случаях (функции замены, функции-обработчики, операции над типами, используемыми для создания экземпляров стандартных шаблонных компонентов библиотеки) стандартная библиотека C ++ зависит от компонентов, предоставляемых программой C ++. Если эти компоненты не соответствуют их требованиям, Стандарт не предъявляет никаких требований к реализации.

     

2 В частности, эффекты не определены в следующих случаях:

     
  • ...
  •   
  • если при создании экземпляра компонента шаблона в качестве аргумента шаблона используется неполный тип (3.9),   если специально не разрешено для этого компонента.
  •   

Быстрое сканирование с помощью 20.9.3 шаблона класса reference_wrapper [refwrap] не обнаруживает такого конкретного исключения для reference_wrapper, поэтому ваша программа имеет неопределенное поведение. Обе реализации соответствуют.

ответил Casey 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 25 Sep 2014 21:00:16 +0400 2014, 21:00:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132