環境cin.get:vs2013のRC5/vs2017;
プロジェクト:Win32コンソールアプリケーション、ラムダについての驚くべき値と
表現:少しの間をコンパイルして実行し、中断し、変数 "task_" を見ると、
func mainの "add_task(& Test :: print、& t、str、10)"の場合、 "task_"は正しい値です。
func mytestの "add_task(& Test :: print、& t、str、10)"の場合、 "task_"は間違った値です。 std :: cin.get()をwhile(1){}に置き換えると、右に変わります。 C++で
#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
正しい値:void(void){func = 0x00b51087 {テスト用のprint(クラスstd :: basic_string 、クラスstd :: allocator > const&、int)} ...} –
fredirty2017