可以在新的c++ 11中创建可选的引用吗?

Can optional references be created in the new C++11?

本文关键字:引用 创建 c++      更新时间:2023-10-16

给定新的c++ 11标准和其中引入的move语义,是否有可能为构造函数引用创建默认值?在c++中通过引用传递参数的默认值据说不是,但也许新标准允许一些技巧。

基本上,我想要的是为正常使用使用默认对象,并传递一个模拟对象,该对象记录了主机对象在测试阶段所做的所有调用。应该是像

这样的东西
class A {
   B& b;
   public:
       A(B & b = B()){} // This does not work
}

测试时我想要的是

BMock bMock;
A a(bMock);
bMock.getStatistics();

任何想法?

这个怎么样:

class Foo
{
  B default_B;
public:
  std::reference_wrapper<B> b;
  Foo() : b(std::ref(default_B)) { }
  Foo(B & br) b(std::ref(br)) { }
};

在默认情况下,以牺牲动态分配为代价,这里有一个可能更轻量级的替代想法:

#include <memory>
class Foo
{
  std::unique_ptr<B> pB;
public:
  std::reference_wrapper<B> b;
  Foo() : pb(new B), b(std::ref(*pb)) { }
  Foo(B & br) pb(), b(std::ref(br)) { }
};

是的,默认初始化表达式是一个临时对象,它将绑定到一个右值引用。但是,您需要通过std::move传递非临时对象以获得它们以绑定到引用。

通常通过std::move传递一些东西表明它将被调用的函数销毁。该标准甚至将std::move的结果称为"过期值",尽管它在语义上并不一定要过期,但这是一个相当强的约定。

所以,你可以这样做,但要小心。

仔细查看您的示例,您希望在a中保留对b的引用,这意味着如果没有使用参数,则没有地方可以永久存储建议的默认值。您将保留对已销毁的临时对象的引用。所以很遗憾,我不能真正适应你的例子。

只是一个想法,这个怎么样:

class A 
{
    std::shared_ptr<B> m_b;
public:
    A() : m_b(new B) {}
    A(B& b) : m_b(&b, [](B*){}) {}
};

另外,我反对存储任何你作为参考的东西,我不觉得它意味着你的用法。我也反对引用成员,因为它们不允许赋值操作符。