相关疑难解决方法(0)

什么是移动语义?

我刚刚听完了Scott Meyers关于C++ 0x的软件工程电台播客采访.大多数新功能对我来说都很有意义,我现在对C++ 0x感到兴奋,除了一个.我仍然没有得到移动语义 ......它们究竟是什么?

c++ c++-faq move-semantics c++11

1614
推荐指数
11
解决办法
39万
查看次数

使用前进的优点

在完美转发中,std::forward用于转换命名的右值引用t1t2未命名的右值引用.这样做的目的是什么?inner如果我们离开t1&t2作为左值,那将如何影响被调用的函数?

template <typename T1, typename T2>
void outer(T1&& t1, T2&& t2) 
{
    inner(std::forward<T1>(t1), std::forward<T2>(t2));
}
Run Code Online (Sandbox Code Playgroud)

c++ c++-faq rvalue-reference perfect-forwarding c++11

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

如何将unique_ptr参数传递给构造函数或函数?

我是新手在C++ 11中移动语义,我不太清楚如何处理unique_ptr构造函数或函数中的参数.考虑这个引用自身的类:

#include <memory>

class Base
{
  public:

    typedef unique_ptr<Base> UPtr;

    Base(){}
    Base(Base::UPtr n):next(std::move(n)){}

    virtual ~Base(){}

    void setNext(Base::UPtr n)
    {
      next = std::move(n);
    }

  protected :

    Base::UPtr next;

};
Run Code Online (Sandbox Code Playgroud)

这是我应该如何编写unique_ptr参数的函数?

我需要std::move在调用代码中使用吗?

Base::UPtr b1;
Base::UPtr b2(new Base());

b1->setNext(b2); //should I write b1->setNext(std::move(b2)); instead?
Run Code Online (Sandbox Code Playgroud)

c++ arguments unique-ptr c++11

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

C++双地址运算符?(&&)

我正在阅读STL源代码,我不知道&&运算符应该做什么.以下是一个代码示例stl_vector.h:

vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
    // NB: DR 675.
    this->clear();
    this->swap(__x); 
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

"地址"是否有意义?为什么它有两个地址运算符而不是一个?

c++ stl memory-address operator-keyword

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

什么是同时迭代两个或更多容器的最佳方法

C++ 11提供了多种迭代容器的方法.例如:

基于范围的循环

for(auto c : container) fun(c)
Run Code Online (Sandbox Code Playgroud)

的std :: for_each的

for_each(container.begin(),container.end(),fun)
Run Code Online (Sandbox Code Playgroud)

但是,建议的方法是迭代两个(或更多)相同大小的容器来完成以下操作:

for(unsigned i = 0; i < containerA.size(); ++i) {
  containerA[i] = containerB[i];
}
Run Code Online (Sandbox Code Playgroud)

c++ containers iterator c++11

98
推荐指数
10
解决办法
7万
查看次数

模板化函数是应该按值还是通过右值引用获取lambda参数?

C++ 11模式下的GCC 4.7让我定义了一个以两种不同方式获取lambda的函数:

// by value
template<class FunctorT>
void foo(FunctorT f) { /* stuff */ }
Run Code Online (Sandbox Code Playgroud)

和:

// by r-value reference
template<class FunctorT>
void foo(FunctorT&& f) { /* stuff */ }
Run Code Online (Sandbox Code Playgroud)

但不是:

// by reference
template<class FunctorT>
void foo(FunctorT& f) { /* stuff */ }
Run Code Online (Sandbox Code Playgroud)

我知道我可以取消模板化函数,只需要使用std :: functions,但是foo它很小并且内联,我想给编译器提供最好的机会来内联调用它.在前两个中,如果我特别知道我正在传递lambdas,那么这对性能来说是优选的,为什么不允许将lambda传递给最后一个?

c++ lambda templates g++ c++11

29
推荐指数
2
解决办法
4206
查看次数

回调vs lambda

假设我有以下代码我想重构:

int toFuture()
{
  precalc();
  int calc = 5 * foobar_x() + 3;
  postcalc();
  return calc;
}

int toPast()
{
  precalc();
  int calc = 5 * foobar_y() - 9;
  postcalc();
  return calc;
}
Run Code Online (Sandbox Code Playgroud)

在classic-C中,我将这个代码重构为一个worker(),它接受一个执行计算的函数指针:worker()中的公共代码,函数指针提供的特定代码.

使用C++ 11,我应该使用lambda吗?如果是这样,在这种情况下我将如何实现它?

编辑:我只是想到一个模板也可以工作.模板实现如何与其他两个进行比较?

c++ lambda c++11

26
推荐指数
3
解决办法
6065
查看次数

通用引用的语法

这是一个右值参考:

void foo(int&& a);
Run Code Online (Sandbox Code Playgroud)

它不绑定到左值:

int i = 42;
foo(i);   // error
Run Code Online (Sandbox Code Playgroud)

这是一个普遍的参考:

template<typename T>
void bar(T&& b);
Run Code Online (Sandbox Code Playgroud)

它绑定到右值,它也绑定到左值:

bar(i);   // okay
Run Code Online (Sandbox Code Playgroud)

这是一个右值参考:

template<typename T>
struct X
{
    void baz(T&& c);
};
Run Code Online (Sandbox Code Playgroud)

它不绑定到左值:

X<int> x;
x.baz(i);   // error
Run Code Online (Sandbox Code Playgroud)

为什么通用引用使用与右值引用相同的语法?这不是一个不必要的混乱来源吗?难道该委员会曾经考虑替代语法像T&&&,T&*,T@T&42(开玩笑的对最后一个)?如果是这样,拒绝替代语法的原因是什么?

c++ language-design rvalue-reference c++11 forwarding-reference

24
推荐指数
2
解决办法
1957
查看次数

究竟什么是C++中的R值?

有人可以向R-Value解释或指出某种解释吗?我不确定它是什么,我的项目必须加入它.下面是R-Value的演示(第一部分是r_string.hpp):

#include <algorithm>
#include <iostream>

template <typename CHAR_T = char>

class basic_rstring {
public:
    typedef CHAR_T  value_type;
    typedef CHAR_T* pointer_type;
    typedef CHAR_T const*   pointer_const_type;
private:
    pointer_type    _data;
    std::size_t     _length;
public:
    basic_rstring() : _data(nullptr), _length(0) 
    {
        std::cout << "Default ctor\n";
    }

    basic_rstring( pointer_const_type s ) 
        : _data( nullptr )
        , _length( 0 )
    {
        std::cout << "Literal ctor: " << s << std::endl;
        _length = strlen( s );
        _data = new value_type[ _length + 1 ];
        std::copy( s, s + _length …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

来自const std :: vector <>&的auto; 对象或参考?

假设我们有一个具有以下接口的对象:

struct Node_t {
 ... const std::vector< something >& getChilds() const;
 } node;
Run Code Online (Sandbox Code Playgroud)

现在,我使用如下auto变量访问该属性:

auto childs = node->getChilds();
Run Code Online (Sandbox Code Playgroud)

是什么类型的childs?a std::vector< something >或对一个的引用?

c++ auto c++11

21
推荐指数
2
解决办法
9888
查看次数