给出以下示例代码:
int main()
{
int i;
auto f = [=]()mutable->int*
{
return &i;
};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我对lambdas的理解是编译器将生成一个仿函数类.该仿函数类将包含所有复制变量的成员(i
在示例中).我相信在我的代码的上下文中,只要f
存在,就可以安全地返回其成员之一的地址.在我看来,所有编译器都错了.我认为关于在超出范围之后使用该f
成员的地址的警告是有效的,但关于"本地变量'我'的警告是不正确的/误导性的.我对吗?i
f
我正在努力消除我的一些困惑.我偶然发现了boost :: asio :: thread_pool,我认为可以使用以某种方式自动组合,boost::asio::io_context
并且boost::thread::thread_group
经常建议(这里或这里).似乎这个asio
特定的池可以用于post
任务,但另一方面,某些网络类型resolver
需要传递一个对象io_context
作为构造函数参数,而这些参数thread_pool
不是也不是从中派生出来的.
我观察到Visual Studio 11 Beta中的新库与使用thread()和ref()的Boost之间的行为有所不同.我想知道谁是对的.如果标准偏离Boost的原始实现,则可能是两者.(但我不打算破译标准...)
我会用MinGW尝试过... Alas,AFAIK,<thread>对MinGW无效.
那么,第一个问题是,gcc和Clang是否表现出相同的编译失败?如果他们不这样做,我将提交一个针对VS的错误.第二个问题可能是,如果编译失败是正确的,我的解决方法是什么来获得Boost给我的东西(没有继续使用Boost)?
而且我想我确实有第三个问题......我开始做什么甚至犹豫不决?
class base
{
public:
virtual void operator()() = 0;
};
class derived : public base
{
public:
virtual void operator()()
{
cout << "derived" << endl;
}
};
int main()
{
base *b = new derived;
std::thread t(std::ref(*b)); // Nasty compilation errors.
boost::thread t(boost::ref(*b)); // Works fine.
t.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在尝试编译以下代码时,会将map
s键复制到vector
:
map<string, string> mss;
vector<string> vs;
transform(mss.begin(), mss.end(), back_inserter(vs), get<0>);
Run Code Online (Sandbox Code Playgroud)
VS2013无法区分哪个get
是预期的,但这个更简单的用法可以正常工作:
vs.push_back(get<0>(*mss.begin()));
Run Code Online (Sandbox Code Playgroud)
指定get<0, string, string>
没有帮助.我错过了什么?
我有线程1执行以下代码:
unique_lock<mutex> ul(m);
while(condition == true)
cv.wait(ul);
Run Code Online (Sandbox Code Playgroud)
并且线程2执行此代码:
condition = false;
cv.notify_one();
Run Code Online (Sandbox Code Playgroud)
不幸的是我遇到了时间问题:
T1: condition checks true
T2: condition set to false
T2: cv.notify_one()
T1: cv.wait()
Run Code Online (Sandbox Code Playgroud)
线程1完全错过了通知,并在wait()时保持阻塞状态.我尝试使用wait()版本,它接受一个谓词,但结果基本相同.也就是说,谓词的主体执行检查,但在它返回之前,条件的值被改变并且发送通知.然后谓词返回.
我怎样才能解决这个问题?
给出以下c ++/cli代码:
public ref class A
{
public:
typedef System::String B;
};
Run Code Online (Sandbox Code Playgroud)
如何使用以下C#代码:
var b = new A.B();
Run Code Online (Sandbox Code Playgroud)
编辑:如果它有帮助,这typedef
不是一个硬性要求.我的目标是最终定义一次并在两个世界中都可用的类型.
在C#中执行此操作时:
using Word = System.String;
using Words = System.Collections.Generic.List<Word>;
Run Code Online (Sandbox Code Playgroud)
编译器抱怨"无法找到类型或命名空间'Word'".这不可能吗?如果它有所作为,我试图在全局命名空间中执行此操作.
编辑:刚刚找到另一个回答这个的SO:为什么一个别名的C#Type不能被另一个访问?这可以标记为重复.
用户定义的容器是std :: vector的包装器,是继承还是包含std :: vector?
我有一个应该是容器的类.我看到两个选择:
1)从向量继承2)有一个私有成员向量并覆盖所有向量函数,使我的容器充当向量
我不确定这只是一个风格问题,还是一种方式从根本上比另一种更好?
我想要添加的额外功能很少,很少有数据成员和函数.通常,使用向量中的数据将是方便的功能.
这就是人们如何使用“两天前”获得“两天前”的信息boost::date
:
boost::gregorian::date today = boost::gregorian::day_clock::local_day();
boost::date_time::day_functor<boost::gregorian::date> day_offset(-2);
boost::gregorian::date modified = today + day_offset.get_offset(today);
Run Code Online (Sandbox Code Playgroud)
如何计算代表“上周一”的日期?