Umgebung: vs2013 RC5/vs2017;
Projekt: win32 Konsolenanwendung;ein überraschender Wert über Lambda und cin.get
Darstellung: kompilieren und eine Weile läuft, dann unterbrechen und Variable "task_" sehen;
wenn "add_task (& Test :: print, & t, str, 10)" in func main, der "task_" ist der richtige Wert;
aber wenn "add_task (& Test :: print, & t, str, 10)" in func mytest, der "task_" ist falscher Wert; und wenn ich std :: cin.get() durch while (1) {} ersetze, dreht es sich nach rechts;
#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;
}
falschen Wert: Leere (void) {func = 0xa4509c83 self = 0x0f93c1b0 {msvcp120d.dll std :: basic_ostream > std :: cout} {. ..} ...} –
fredirty2017
korrekter Wert: void (void) {func = 0x00b51087 {tp_test.exe! Test :: print (Klasse std :: basic_string , Klasse std :: allocator > const &, int)} ...} –
fredirty2017