2016-11-06 2 views
2

Я хочу автоматическое вычитание аргументов шаблонной функции, которая принимает функцию при использовании lambdas. Этот пример показывает некоторые из моих вариантов:VS2012 жалуется при использовании + [] {} колдовства

template <class T> 
void foo(void (*func)(T)) { 
    T val; 
    // do something with val and func... 
} 

int main() { 
    auto pfunc0   = [] (int) { /*...*/ }; 
    void (*pfunc1)(int) = [] (int) { /*...*/ }; 
    auto* pfunc2  = +[] (int) { /*...*/ }; 

    foo(pfunc0);  // not ok 
    foo<int>(pfunc0); // ok, but redundant 
    foo(pfunc1);  // ok, but redundant 
    foo(pfunc2);  // ok 
} 

pfunc2 использует трюк я узнал здесь: Obtaining function pointer to lambda?. Поэтому на самом деле я должен быть доволен случаем pfunc2, так как это краткий и не повторяющийся код, к сожалению, Visual C++ 2012 IDE жалуется, что это был ошибочный код, хотя он компилируется просто отлично.

Есть ли обходные пути или рекомендации по этой проблеме?

IDE Сообщения об ошибках:

В строке "авто * pfunc2": IDE подчеркивает 'Auto' и говорит

Error: cannot deduce 'auto' type 

также он подчеркивает '[', где его жалобы

Error: more than one conversion function from "lambda[]void (int)->void" to a build-in type applies: 
function "lambda[]void (int)->void::operator void (*)(int)() const" 
function "lambda[]void (int)->void::operator void (*)(int)() const" 
function "lambda[]void (int)->void::operator void (*)(int)() const" 
+0

У меня нет доступа к VS2012, но вы пробовали 'Foo (+ pfunc0);'? – krzaq

+0

@krzaq Я обновил свой вопрос с сообщениями об ошибках. Я попробовал ваше предложение, но ничего не изменил (те же сообщения об ошибках). – testman

+0

@testman Плохо, я полностью пропустил это! – Quentin

ответ

1

Это связано с this bug (закрыто как «по дизайну»). VC++ поддерживает несколько соглашений о вызовах на x86, а lambdas с пустыми списками захвата обеспечивают конверсии для всех. Вот почему есть двусмысленность.

К сожалению, в этом случае нет обходного пути, которые вы еще не пробовали.

Кстати, эта ошибка указана как зафиксировано в Visual C++ 2015 Update 2

+0

Я установил обновление Visual Studio Community 2015 версии 14.0.25431.01 3 теперь не жалуется не только среда IDE, но и компилятор:/ – testman

+0

@testman Я помню, что там было именование mixup с Visual Studio 2015, причем две версии называются очень похожими друг на друга: https://pay.reddit.com/r/cpp/comments/56ecje/psa_visual_studio_15_and_visual_studio_2015_are_2/ Возможно, это жертва? – krzaq

Смежные вопросы