Это компилятор или только я: Наследование от вариативного шаблона, состоящего из лямбда-выражений

У меня есть код, который работает в GCC, но не компилируется в Visual Studio 2015 (который, как я понимаю, находится в разработке, но я думаю, что эта область должна быть реализована).

template< typename... T >
class inherit : public T...
{
public:
inherit(T... t) : T(t)... {}
};

int main() {
  auto l1 = []() {};
  auto l2 = []() {};
  inherit<decltype(l1), decltype(l2)> test(l1, l2);
  return 0;
}

Это фрагмент кода, сведенный к его чистой сущности. Visual Studio сообщает «синтаксическая ошибка:« тип »» в конструкторе наследования. Затем он извергает небольшой след того, как он туда попал, и заключает, что «вы не можете создать экземпляр лямбды».

Я предполагаю, что расширение T(t)... расширяется неправильно. Однако я вполне могу ошибаться в синтаксисе.

РЕДАКТИРОВАТЬ: Извините, вопрос: я виноват здесь или нет? Если да, то каков правильный синтаксис?

ДОПОЛНИТЕЛЬНЫЙ ВЫВОД: в соответствии с ответами, которые я получил, похоже, что это проблема с Visual Studio 2015, имеющей ошибку в этой области. При тестировании кажется, что это расширение, в котором параметры конструктора передаются базовым классам лямбда, в которых возникает проблема. Следующий тест работает под VS2015:

template< typename T1, typename T2, typename... T3 >
class inherit2 : public T3...
{
public:
  inherit2(T1 t1, T2 t2) : T1(t1), T2(t2) {}
};

int main() {
  auto l1 = []() {};
  auto l2 = []() {};
  inherit2<decltype(l1), decltype(l2), decltype(l1), decltype(l2)> test(l1, l2);
  return 0;
}

person qeadz    schedule 14.01.2015    source источник
comment
Выглядит нормально, clang++ тоже его принимает. Что происходит, когда вы удаляете вариативность, но оставляете лямбды?   -  person dyp    schedule 14.01.2015
comment
Я думаю, что у Visual Studio есть проблема, когда вы передаете лямбду в некоторых случаях lambda-key-comparer-for-maps-and-sets" rel="nofollow noreferrer">connect.microsoft.com/VisualStudio/feedback/details/727957/ stackoverflow.com/questions/25777396/   -  person AndyG    schedule 14.01.2015
comment
Ваш код поддерживается начиная с gcc 4.6 и clang 3.1 (оба с начала 2012 года). Visual C++ здесь отстает на 3 года.   -  person TemplateRex    schedule 14.01.2015
comment
@dyp для сбоя необходимы переменные параметры. После некоторого возни, похоже, расширение T(t)... для передачи параметров базовым конструкторам вызывает проблему. Я отредактирую свой пост с выводом на тот случай, если кто-то еще наткнется на это, столкнувшись с той же проблемой.   -  person qeadz    schedule 14.01.2015
comment
Кроме того, поскольку в C++ нет синтаксиса using Ts::operator()...;, вам придется наследовать через дерево или каким-либо образом линейно, если вы хотите создать тип, который является переопределением лямбда-выражений. Кстати, вам не хватает : public T1, public T2 в ваших работах на примере VS2015?   -  person Yakk - Adam Nevraumont    schedule 15.06.2015
comment
@Yakk Я действительно не помню, что я делал с этим сейчас! Насколько я помню, целью было сгруппировать их, и я экспериментировал с использованием TMP, чтобы найти первую лямбду, которая примет аргумент. Все это было просто экспериментом, а не кодом в реальном проекте. Работа в VS2015 была просто для того, чтобы показать, какая часть не может быть вариативной. Создание экземпляра шаблона повторяет типы, поэтому общедоступный T3... расширяется до того же, что и общедоступный T1, общедоступный T2.   -  person qeadz    schedule 15.06.2015
comment
В любом случае весь этот эксперимент оказался бесплодным. Я не смог извлечь из этого ничего полезного. Однако я кое-чему научился, так что вот что!   -  person qeadz    schedule 15.06.2015
comment
Используя наследование лямбда-выражений, вы обычно захотите using T::operator(), что требует линейной (или древовидной) структуры наследования. Затем вы можете вызвать их все и позволить разрешению перегрузки разобраться с этим. В противном случае вы можете засунуть их в std::tuple, если вам просто нужен пакет лямбда-выражений.   -  person Yakk - Adam Nevraumont    schedule 15.06.2015


Ответы (1)


Это компилятор. более новый MSVC версии 19.00.23106.0 от июля 2015 года принимает ваш пример как есть.

Возможно, помог бы синтаксис инициализации скобок T{t}.... Однако я не могу найти подходящий онлайн-компилятор, чтобы попробовать.

person Potatoswatter    schedule 07.08.2015