2012-10-09 76 views
3

我已经拖欠我的拷贝构造函数和拷贝赋值运算符如下:默认拷贝构造函数和拷贝赋值赋值运算符给奇怪的错误

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

,然后给经友好访问这些到一个独立的功能。 在创建一个配置对象的副本,我得到以下警告和注意事项(?):

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

它会出现复制构造函数甚至没有被实例化。 尽管如此,代码似乎运行。

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

+0

[适用于g ++](http://ideone.com/EoCtB)。可能是编译器问题。 – iammilind

+0

你在标题中提到了一个错误,但在这里你只显示一个警告。 – juanchopanza

+0

对不起,我最初在我的问题中也有错误,在纠正之前,忘记了正确的标题! – goji

回答

7

只是省略参数:

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

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

从§8.4.2:

...这是明确违约函数应

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

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

+1

有什么具体原因?如果我提供参数名称会发生​​什么? – Naveen

+1

我想编译器在这里说的够了:警告:未使用的参数'config' –

+0

@Naveen'XXXX = default'只是编译器生成匹配特定函数类型的特殊成员的指令。没有具体说明实际执行的细节。这里的参数不起作用。 – juanchopanza

0

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

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

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

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

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

相关问题