4

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

  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)

4

2 回答 2

8

只需省略参数:

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

上述语句指示编译器生成所述类型的默认特殊成员函数,但未指定这些实现的细节。参数名称是多余的,没有任何作用。编译器可以自由地对合法代码发出警告。

从§8.4.2:

...明确默认的函数应

— 是一个特殊的成员函数,

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

于 2012-10-09T05:36:51.427 回答
1

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

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

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

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

如果没有别的,这里的警告是恕我直言不正确:该参数肯定被使用,它只是由不同的名称或通过其他机制使用。

于 2013-05-15T05:58:59.370 回答