默认的复制构造函数和复制赋值赋值运算符给出了奇怪的错误

时间:2012-10-09 05:35:31

标签: c++ constructor c++11 compiler-errors

我已经默认了我的复制构造函数和复制赋值运算符,如下所示:

  Config(const Config& config) = default;
  Config& operator=(const Config& rhs) = default;

然后通过友谊获得了对这些功能的访问权限。 创建配置对象的副本后,我收到以下警告并注意(?):

  

./ cfg / config.hpp:129:3:警告:未使用的参数'config'   [-Wunused-parameter] cfg / get.cpp:在函数'const cfg :: Config&   cfg :: Get(bool)':cfg / get.cpp:34:30:注意:合成方法   首先需要'cfg :: Config :: Config(const cfg :: Config&)'

看起来复制构造函数甚至没有被实例化。 尽管如此,代码似乎运行。

gcc版本4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5)

2 个答案:

答案 0 :(得分:8)

只需省略参数:

Config(const Config&) = default;
Config& operator=(const Config&) = default;

上述语句指示编译器生成所述类型的默认特殊成员函数,但未指定这些实现的详细信息。参数名称是多余的,无效。编译器可以自由发出合法代码的警告。

来自§8.4.2:

  

......明确默认的函数

     

- 是一个特殊的会员功能,

     

- 具有相同的声明函数类型(可能不同的ref限定符除外,在复制构造函数或复制赋值运算符的情况下,参数类型可以是“引用非const T”,其中T是成员函数的类的名称)就像它已被隐式声明...

答案 1 :(得分:1)

我今天刚遇到这个;虽然我只是使用“省略名称”的解决方法,但是对GCC有两个相关的错误:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50895 - 建议忽略虚拟方法上的“未使用参数”警告(或者可能只是空虚拟方法)。

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57211 - 这个问题(在默认方法中未使用的param名称),由于行/列错误指示符指向类顶部defn而不是默认方法defn这一事实而复杂化。 / p>

从我对错误的评论中可以看出,我的兴趣在于使我的文档更加一致。理想情况下,我可以让我的代码和我的文档都在没有警告的情况下构建。

如果没有别的,这里的警告是IMHO不正确:参数当然是使用的,它只是由不同的名称或通过其他机制使用。