复制构造函数未调用,但编译器抱怨没有

Kar*_*oor 6 c++ copy-constructor

给出以下代码:

#include <boost/noncopyable.hpp>

enum Error { ERR_OK=0 };

struct Filter : private boost::noncopyable
{
  Filter() {}
  virtual ~Filter() {}

  virtual int filter(int* data) const = 0;

};

struct  SpecialFilter : public Filter, private boost::noncopyable
{
  inline SpecialFilter(unsigned int min, unsigned int max) : min(min), max(max) {}
  virtual ~SpecialFilter() {}

  virtual int filter(int* data) const
  {
    // ...
    return ERR_OK;
  }

  unsigned int min;
  unsigned int max;
};

struct AClass
{
  AClass() {}
  AClass(const AClass& other) {}
  ~AClass() {}

  int specialFilter(int channel, int minThreshold, int maxThreshold)
  {
    // ...
    return filter(channel, SpecialFilter(123, 321));
  }

  int filter(int channel, const Filter& filter)
  {
    // ...
    return ERR_OK;
  }

};
Run Code Online (Sandbox Code Playgroud)

我的编译器(GCC 4.2)抱怨:

- warning: direct base ‘boost::noncopyable_::noncopyable’ inaccessible in ‘SpecialFilter’ due to ambiguity
- noncopyable.hpp: In copy constructor ‘Filter::Filter(const Filter&)’:
- noncopyable.hpp:27: error: ‘boost::noncopyable_::noncopyable::noncopyable(const boost::noncopyable_::noncopyable&)’ is private
- synthezised method first required here: [return filter(channel, SpecialFilter(123, 321));]
Run Code Online (Sandbox Code Playgroud)

但是我没有调用复制构造函数!

AnT*_*AnT 11

你永远不会调用复制构造函数.复制构造函数总是由编译器隐式调用.因此,您需要学习识别可能被调用的情况.

将const引用附加到临时对象时

...
return filter(channel, SpecialFilter(123, 321));
...
Run Code Online (Sandbox Code Playgroud)

编译器有权执行临时对象的副本并需要可访问的复制构造函数(即使它实际上不会被调用).这就是导致问题的原因.

换句话说,当你使某些类型不可复制时,你也放弃了将const引用附加到该类型的临时对象的可能性.