我刚刚听完了Scott Meyers关于C++ 0x的软件工程电台播客采访.大多数新功能对我来说都很有意义,我现在对C++ 0x感到兴奋,除了一个.我仍然没有得到移动语义 ......它们究竟是什么?
在完美转发中,std::forward用于转换命名的右值引用t1和t2未命名的右值引用.这样做的目的是什么?inner如果我们离开t1&t2作为左值,那将如何影响被调用的函数?
template <typename T1, typename T2>
void outer(T1&& t1, T2&& t2) 
{
    inner(std::forward<T1>(t1), std::forward<T2>(t2));
}
我是新手在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;
};
这是我应该如何编写unique_ptr参数的函数?
我需要std::move在调用代码中使用吗?
Base::UPtr b1;
Base::UPtr b2(new Base());
b1->setNext(b2); //should I write b1->setNext(std::move(b2)); instead?
我正在阅读STL源代码,我不知道&&运算符应该做什么.以下是一个代码示例stl_vector.h:
vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
    // NB: DR 675.
    this->clear();
    this->swap(__x); 
    return *this;
}
"地址"是否有意义?为什么它有两个地址运算符而不是一个?
C++ 11提供了多种迭代容器的方法.例如:
for(auto c : container) fun(c)
for_each(container.begin(),container.end(),fun)
但是,建议的方法是迭代两个(或更多)相同大小的容器来完成以下操作:
for(unsigned i = 0; i < containerA.size(); ++i) {
  containerA[i] = containerB[i];
}
C++ 11模式下的GCC 4.7让我定义了一个以两种不同方式获取lambda的函数:
// by value
template<class FunctorT>
void foo(FunctorT f) { /* stuff */ }
和:
// by r-value reference
template<class FunctorT>
void foo(FunctorT&& f) { /* stuff */ }
但不是:
// by reference
template<class FunctorT>
void foo(FunctorT& f) { /* stuff */ }
我知道我可以取消模板化函数,只需要使用std :: functions,但是foo它很小并且内联,我想给编译器提供最好的机会来内联调用它.在前两个中,如果我特别知道我正在传递lambdas,那么这对性能来说是优选的,为什么不允许将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;
}
在classic-C中,我将这个代码重构为一个worker(),它接受一个执行计算的函数指针:worker()中的公共代码,函数指针提供的特定代码.
使用C++ 11,我应该使用lambda吗?如果是这样,在这种情况下我将如何实现它?
编辑:我只是想到一个模板也可以工作.模板实现如何与其他两个进行比较?
这是一个右值参考:
void foo(int&& a);
它不绑定到左值:
int i = 42;
foo(i);   // error
这是一个普遍的参考:
template<typename T>
void bar(T&& b);
它绑定到右值,它也绑定到左值:
bar(i);   // okay
这是一个右值参考:
template<typename T>
struct X
{
    void baz(T&& c);
};
它不绑定到左值:
X<int> x;
x.baz(i);   // error
为什么通用引用使用与右值引用相同的语法?这不是一个不必要的混乱来源吗?难道该委员会曾经考虑替代语法像T&&&,T&*,T@或T&42(开玩笑的对最后一个)?如果是这样,拒绝替代语法的原因是什么?
c++ language-design rvalue-reference c++11 forwarding-reference
有人可以向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 …假设我们有一个具有以下接口的对象:
struct Node_t {
 ... const std::vector< something >& getChilds() const;
 } node;
现在,我使用如下auto变量访问该属性:
auto childs = node->getChilds();
是什么类型的childs?a std::vector< something >或对一个的引用?