小编scr*_*nut的帖子

lambda可以安全地返回复制变量的地址吗?

给出以下示例代码:

int main()
{
    int i;
    auto f = [=]()mutable->int*
    {
            return &i;
    };

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. g ++ v.4.8.1警告"返回的局部变量'i'的地址".
  2. Clang v.3.2(MacOS的Clang)警告说"与本地变量'i'相关联的堆栈存储器的地址返回".
  3. VS2012和VS2013 RC都没有发出任何警告.

我对lambdas的理解是编译器将生成一个仿函数类.该仿函数类将包含所有复制变量的成员(i在示例中).我相信在我的代码的上下文中,只要f存在,就可以安全地返回其成员之一的地址.在我看来,所有编译器都错了.我认为关于在超出范围之后使用该f成员的地址的警告是有效的,但关于"本地变量'我'的警告是不正确的/误导性的.我对吗?if

c++ lambda c++11

16
推荐指数
1
解决办法
440
查看次数

可以使用boost :: asio :: thread_pool而不是将boost :: asio :: io_context与boost :: thread :: thread_group结合使用吗?

我正在努力消除我的一些困惑.我偶然发现了boost :: asio :: thread_pool,我认为可以使用以某种方式自动组合,boost::asio::io_context并且boost::thread::thread_group经常建议(这里这里).似乎这个asio特定的池可以用于post任务,但另一方面,某些网络类型resolver需要传递一个对象io_context作为构造函数参数,而这些参数thread_pool不是也不是从中派生出来的.

c++ boost-asio

14
推荐指数
2
解决办法
664
查看次数

在C++ 11中,你可以将ref'ed基类传递给线程的构造函数并获得多态行为吗?

我观察到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)

c++ multithreading ref c++11

8
推荐指数
1
解决办法
394
查看次数

为什么我不能在std :: transform中使用std :: get <0>?

在尝试编译以下代码时,会将maps键复制到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>没有帮助.我错过了什么?

c++ function-templates overload-resolution c++11

8
推荐指数
2
解决办法
876
查看次数

C++ 11我可以确保condition_variable.wait()不会错过通知吗?

我有线程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++ multithreading condition-variable c++11

6
推荐指数
1
解决办法
1634
查看次数

在C#中,如何从C++/CLI类引用typedef

给出以下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# c++-cli

5
推荐指数
1
解决办法
1692
查看次数

类型别名是否可以引用其他类型别名?

在C#中执行此操作时:

using Word = System.String;
using Words = System.Collections.Generic.List<Word>;
Run Code Online (Sandbox Code Playgroud)

编译器抱怨"无法找到类型或命名空间'Word'".这不可能吗?如果它有所作为,我试图在全局命名空间中执行此操作.

编辑:刚刚找到另一个回答这个的SO:为什么一个别名的C#Type不能被另一个访问?这可以标记为重复.

c#

5
推荐指数
1
解决办法
76
查看次数

用户定义的容器是std :: vector的包装器,是继承还是包含std :: vector?

用户定义的容器是std :: vector的包装器,是继承还是包含std :: vector?

我有一个应该是容器的类.我看到两个选择:

1)从向量继承2)有一个私有成员向量并覆盖所有向量函数,使我的容器充当向量

我不确定这只是一个风格问题,还是一种方式从根本上比另一种更好?

我想要添加的额外功能很少,很少有数据成员和函数.通常,使用向量中的数据将是方便的功能.

c++ vector

4
推荐指数
1
解决办法
151
查看次数

使用 boost::date,如何计算“上周一”?

这就是人们如何使用“两天前”获得“两天前”的信息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)

如何计算代表“上周一”的日期?

c++ boost-date-time

4
推荐指数
1
解决办法
804
查看次数