小编R. *_*des的帖子

Lambda作为函数参数

在不使用auto或模板的情况下声明lambda变量或函数参数的符号是​​什么?有没有办法这样做?或者编译器是否为每个lambda定义一个唯一的类对象,其编程时间之前程序员的名称是未知的?如果是这样,为什么?它们不能仅作为某种函数指针传递吗?如果不可能,那将是一个很大的失望.

c++ lambda c++11

59
推荐指数
2
解决办法
5万
查看次数

`std :: kill_dependency`做了什么,为什么我要使用它?

我一直在阅读有关新C++ 11内存模型的内容,并且我已经开始使用该std::kill_dependency功能(§29.3/ 14-15).我很难理解为什么我会想要使用它.

我在N2664提案中找到了一个例子,但它并没有多大帮助.

它首先显示代码而不是std::kill_dependency.这里,第一行将依赖性携带到第二行中,第二行将依赖性携带到索引操作中,然后将依赖性携带到do_something_with函数中.

r1 = x.load(memory_order_consume);
r2 = r1->index;
do_something_with(a[r2]);
Run Code Online (Sandbox Code Playgroud)

还有一个例子std::kill_dependency用于打破第二行和索引之间的依赖关系.

r1 = x.load(memory_order_consume);
r2 = r1->index;
do_something_with(a[std::kill_dependency(r2)]);
Run Code Online (Sandbox Code Playgroud)

据我所知,这意味着索引和调用do_something_with不是在第二行之前排序的依赖项.根据N2664:

这允许编译器将调用重新排序do_something_with,例如,通过执行预测值的推测优化a[r2].

为了使得需要调用do_something_with该值a[r2].假设编译器"知道"数组填充了零,它可以根据需要优化该调用do_something_with(0);并相对于其他两个指令重新排序此调用.它可以产生以下任何一种:

// 1
r1 = x.load(memory_order_consume);
r2 = r1->index;
do_something_with(0);
// 2
r1 = x.load(memory_order_consume);
do_something_with(0);
r2 = r1->index;
// 3
do_something_with(0);
r1 = x.load(memory_order_consume);
r2 = r1->index;
Run Code Online (Sandbox Code Playgroud)

我的理解是否正确?

如果do_something_with通过其他方式与另一个线程同步,这对于x.load调用的顺序和另一个线程意味着什么?

假设我的描述是正确的,那还有一件事让我感到困惑:当我编写代码时,是什么原因导致我选择杀死依赖?

c++ multithreading memory-model c++11

57
推荐指数
2
解决办法
3296
查看次数

C++ 11:用std :: shared_ptr()替换所有非拥有的原始指针?

随着它的出现std::unique_ptr,瑕疵std::auto_ptr最终可以得到休息.所以在过去的几天里,我一直在改变我的代码以使用智能指针并delete从我的代码中消除所有代码.

虽然valgrind说我的代码是内存清晰的,但智能指针的语义丰富性将使代码更清晰,更易于理解.

在大多数代码中,转换很简单:std::unique_ptr用于代替拥有对象持有的原始指针,抛弃delete,仔细撒取get(),reset()move()根据需要调用,以便与其余代码良好地连接.

我现在正在将非拥有原始指针转换为智能指针.

由于我小心对象的生命周期(我确保我的模块只依赖于一个方向),valgrind告诉我,我没有任何未初始化的读取,悬空指针或泄漏.所以,从技术上讲,我现在可以单独留下那些非拥有的原始指针.

但是,一种选择是将那些非拥有的原始指针更改为,std::shared_ptr因为我知道它们是非循环的.或者,将它们留作原始指针会更好吗?

我需要智能指针的资深用户提供一些建议,告诉你使用什么经验法则来决定是否保留非拥有的原始指针,或将它们翻译成std::shared_ptr,请记住我经常进行单元测试和valgrind我的码.

编辑:我可能误解了它的使用std::shared_ptr- 它们是否可以结合使用std::unique_ptr,或者如果我使用的话std::shared_ptr,所有句柄也应该是这样的情况std::shared_ptr

c++ memory smart-pointers c++11

57
推荐指数
3
解决办法
2万
查看次数

什么能和不能专注于std命名空间?

允许用户向std命名空间添加显式特化.但是,有一些模板我明确禁止专业化.

我可以和不可以使用哪些模板?

c++ std explicit-specialization c++11

56
推荐指数
1
解决办法
3194
查看次数

在Release版本中使用assert()时避免使用未使用的变量警告

有时局部变量的唯一目的是在assert()中检查它,就像这样 -

int Result = Func();
assert( Result == 1 );
Run Code Online (Sandbox Code Playgroud)

在Release版本中编译代码时,通常会禁用assert(),因此此代码可能会生成有关Result已设置但从未读取的警告.

可能的解决方法是 -

int Result = Func();
if ( Result == 1 )
{
    assert( 0 );
}
Run Code Online (Sandbox Code Playgroud)

但它需要太多的打字,在眼睛上并不容易,并且导致总是检查条件(是的,编译器可以优化检查,但仍然).

我正在寻找一种替代方法来表达这个assert()的方式不会导致警告,但仍然易于使用并避免更改assert()的语义.

(在此区域代码中使用#pragma禁用警告不是一种选择,并且降低警告级别以使其消失也不是一种选择......).

c++ warnings assertions

55
推荐指数
6
解决办法
2万
查看次数

unique_ptr提升等价?

在boost库中是否有一些与C++ 1x的std :: unique_ptr等效的类?我正在寻找的行为是能够拥有异常安全的工厂功能,就像这样......

std::unique_ptr<Base> create_base()
{
    return std::unique_ptr<Base>(new Derived);
}

void some_other_function()
{
    std::unique_ptr<Base> b = create_base();

    // Do some stuff with b that may or may not throw an exception...

    // Now b is destructed automagically.
}
Run Code Online (Sandbox Code Playgroud)

编辑:现在,我正在使用这个黑客,这似乎是我能在这一点上得到的最好的......

Base* create_base()
{
    return new Derived;
}

void some_other_function()
{
    boost::scoped_ptr<Base> b = create_base();

    // Do some stuff with b that may or may not throw an exception...

    // Now b is deleted automagically.
}
Run Code Online (Sandbox Code Playgroud)

c++ boost unique-ptr c++11

55
推荐指数
4
解决办法
4万
查看次数

在C++ 11中的析构函数后覆盖标识符

虚拟析构函数声明后的覆盖标识符是否有任何特殊含义?

class Base
{
public:
    virtual ~Base()
    {}

    virtual int Method() const
    {}
};

class Derived : public Base
{
public:
    virtual ~Derived() override
    {}

    virtual int Method() override // error: marked override, but does not override - missing const
    {}
};
Run Code Online (Sandbox Code Playgroud)

在虚方法上使用覆盖标识符作为检查非常有用:当Base虚方法实际上未被覆盖时,编译器将报告错误.

虚拟析构函数上的覆盖是否也有任何含义/功能?

c++ overriding virtual-destructor c++11

55
推荐指数
2
解决办法
3万
查看次数

如何编写使用临时容器的范围管道?

我有这个签名的第三方功能:

std::vector<T> f(T t);
Run Code Online (Sandbox Code Playgroud)

我还有一个已命名的潜在无限范围(范围-v3排序).我想创建一个映射到该范围的所有元素的管道,并将所有向量展平为包含其所有元素的单个范围.Tsrcf

本能地,我会写下面的内容.

 auto rng = src | view::transform(f) | view::join;
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,因为我们无法创建临时容器的视图.

range-v3如何支持这样的范围管道?

c++ range-v3

55
推荐指数
5
解决办法
2275
查看次数

JavaScript中是否有字典实现?

如何在JavaScript中使用索引器实现数组?.Net中有字典吗?

.net javascript arrays dictionary

54
推荐指数
5
解决办法
5万
查看次数

48
推荐指数
3
解决办法
4万
查看次数