环境令人惊讶值:vs2013 RC5/vs2017;
项目:Win32控制台应用程序;约Lambda和cin.get
表示:编译和运行了一小会儿,然后中断和观看变量 “TASK_”;
如果 “add_task(&测试::打印,&吨,STR,10)”,在主FUNC中, “TASK_” 是正确值;
但是如果在func mytest中“add_task(& Test :: print,& t,str,10)”,则“task_”是错误的值;如果用while(1){}替换std :: cin.get(),它会右转;
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
#include <functional>
using task_t = std::function<void()>;
class Test
{
public:
void print(const std::string& str, int i)
{
std::cout << "Test: " << str << ", i: " << i << std::endl;
}
};
template<typename Function, typename Self, typename... Args>
void add_task(const Function& func, Self* self, Args... args)
{
task_t task = [&func, &self, args...]{ return (*self.*func)(args...); };
task_ = task;
}
Test t;
std::string str = "Hello world";
task_t task_ = nullptr;
void mytest()
{
add_task(&Test::print, &t, str, 10);
}
int main()
{
mytest();
std::cin.get();
return 0;
}
错误值:空隙(无效){FUNC = 0xa4509c83自我= 0x0f93c1b0 {msvcp120d.dll的std :: basic_ostream <炭的std :: char_traits >的std :: COUT} {。 ..} ...} –
fredirty2017
正确的值:无效(无效){FUNC = {0x00b51087测试tp_test.exe ::打印(类的std :: basic_string的<字符,结构的std :: char_traits ,类std :: allocator > const&,int)} ...} –
fredirty2017