gpt4 book ai didi

c++ - 未调用复制构造函数,但编译器提示没有

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:15:23 26 4
gpt4 key购买 nike

给定以下代码:

#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;
}

};

我的编译器 (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));]

但是我没有调用拷贝构造函数!

最佳答案

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

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

...
return filter(channel, SpecialFilter(123, 321));
...

编译器有权执行临时对象的拷贝并需要一个可访问的拷贝构造函数(即使它不会被实际调用)。这就是导致您的问题的原因。

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

关于c++ - 未调用复制构造函数,但编译器提示没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1932700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com