C++ C++;避免复制

C++ C++;避免复制,c++,copy,facade,C++,Copy,Facade,考虑以下简化的立面模式: class Foo { public: int times; int eval(const int val) { return val*times; } }; class Bar { Foo foo; public: Bar(const Foo& f) : foo(f) {} double eval(const double val) { return val * foo.times; } }

考虑以下简化的立面模式:

  class Foo {
  public:
    int times;

    int eval(const int val) { return val*times; }
  };

  class Bar {
    Foo foo;
  public:
    Bar(const Foo& f) : foo(f) {}

    double eval(const double val) { return val * foo.times; }
  };
显然,Bar实例仅用于评估Foo的eval()方法的特殊(即双值)解释。酒吧除了转发给foo外,没有其他成员

出于安全原因,我没有在条形图内部使用
常量
引用或
指针
(我只是不知道某个条形图实例是否会在某个时候从
堆栈
框架中退出,所以资源管理很重要)

我的问题有两个:

  • C++
    编译器是否可能检测到Bar仅仅是一个门面和 “内联”成员访问权限
  • 有(安全的)方法防止复制吗 传递的对象的名称
  • 在某些平台(gcc/clang)上,可以使用属性强制内联,或者在函数未内联时发出警告
  • 不,如果不想复制,则需要保证对象在其他位置的使用寿命。如果你认为这是不安全的,不要这样做。你能做的就是移动一个物体。这可以避免复制和生存期问题,但在编译器中可能无法实现
  • 例如:

     struct Bar {
       // Only accept rvalues of Foo
       explicit Bar(Foo&& f) : f(std::move(f)) {}
       Foo f;
     };
    

    1-是的,编译器将很可能内联函数[它取决于编译器)

    2-始终坚持。在C++3中,
    Foo
    对象
    Foo
    应为成员变量(如您所做),或托管指针(在复制构造函数和赋值运算符处复制,在析构函数处删除)。在C++11中,您可以使用正确的值引用


    注意:这个例子不是一个facade!

    1。它可能会内联它。你是对的,它也是一个适配器,但我一直认为facade是该模式的更“一般”的描述(即对意图的抽象)——不是这样吗?