msvc std::function не принимает общую лямбду с вложенной лямбдой

Следующее работает с gcc 5.2 и clang 3.7, но не работает с msvc 2015:

#include <functional>

int main()
{
  auto const foo = [](auto&& i) {
    auto const bar = []{ return 100; };
    return bar();
  };

  std::function<int(int)> fn = foo;
  return 0;
}

Это ошибка в msvc или gcc и clang слишком слабые?


person Nubcase    schedule 13.12.2015    source источник
comment
Какая версия Visual Studio?   -  person Nicol Bolas    schedule 13.12.2015
comment
Он компилируется, если вы измените его на auto const foo = [](auto&& i) -> int {   -  person melak47    schedule 13.12.2015
comment
@ melak47, явно указывающий тип возвращаемого значения, подтвержденный работой с vs2015. Хотя он не работает с последним (самым последним?) компилятором v19.00.23602.0 (webcompiler.cloudapp. сеть). Во всяком случае, я думаю, что нет необходимости указывать тип возвращаемого значения.   -  person Nubcase    schedule 13.12.2015
comment
Я бы определенно все равно зарегистрировал ошибку, и обновление 1, и то, что я полагаю, является сборкой компилятора WIP Update 2, не принимают ее.   -  person melak47    schedule 13.12.2015


Ответы (2)


Если я попытаюсь сделать это с помощью официального онлайн-компилятора Microsoft версии 19.00.23602.0(x86), последний раз обновленной 3 декабря, 2015, время выполнения истекло1. Удаление std::function<int(int)> fn = foo; позволит успешно выполнить компиляцию. Не стесняйтесь сообщить Microsoft через Visual Studio Connect, чтобы они могли исследовать ошибку и сообщить о ней. Да, можно потратить время на пролистывание стандарта, чтобы убедиться, что это «законный» код, но вы получите гораздо больше отдачи от затраченных средств, используя систему отслеживания ошибок.

1 Внутренняя ошибка компилятора всегда является ошибкой.

person user5673788    schedule 13.12.2015
comment
Я не знал, что ms предоставляет онлайн-компилятор. Спасибо за это. - person Nubcase; 13.12.2015

Это ошибка в Visual C++ 2015, но, похоже, это было исправлено в обновлении 3. Обходным путем является указание возвращаемого типа внешней лямбды (спасибо melak47).

Это не удается:

#include <functional>

int main()
{
    std::function<void (bool)> f =
        [](auto&&)
        {
            []{};
        };
}

с:

Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

a.cpp
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\type_traits(1348):
    error C2065: '_Args': undeclared identifier
    [...and more]

Но это работает:

#include <functional>

int main()
{
    std::function<void (bool)> f =
        [](auto&&) -> void
        {
            []{};
        };
}
person isanae    schedule 03.02.2016