可以在新的c++ 11中创建可选的引用吗?
Can optional references be created in the new C++11?
给定新的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*){}) {}
};
另外,我反对存储任何你作为参考的东西,我不觉得它意味着你的用法。我也反对引用成员,因为它们不允许赋值操作符。
相关文章:
- 创建引用向量的优雅方式
- 为什么当我们有常量引用时创建临时对象?
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 如何从绝对地址的 C 样式指针创建对C++对象的引用
- 如何创建对smart_pointer的引用?
- CMake 引用我在 ~/bin 中创建的随机 shell 脚本(即使我删除了它)?
- C++在函数中创建的对 Eigen::Matrix 的悬空引用
- 如何在C++中使用 new 运算符创建对动态创建的数组的引用?
- 从引用创建指向基类的智能指针
- 通过向构造函数其他对象引用页面来创建对象
- C++为具有引用成员变量的类创建复制构造函数
- 创建<int>对整数数组指针的矢量引用 (C++)
- 哪个 const 与哪个引用将更改参数并创建一个 const 对象?
- 为什么从引用创建共享指针会复制对象?
- 三元运算符为C++中返回的引用创建临时
- 从引用创建shared_ptr
- 通过引用创建别名以提升:shared_ptr
- 从原始指针/引用创建智能指针
- 您能否从抽象引用创建具体对象的副本
- Boost::make_shared引用创建的shared_ptr