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 から:

... 明示的にデフォルト設定された関数は、

— 特別なメンバー関数になる

— 同じ宣言された関数型を持っている (ref 修飾子が異なる可能性があることと、コピー コンストラクターまたはコピー代入演算子の場合を除き、パラメーターの型が "非 const T への参照" である可能性があることを除いて、T はその名前です)。メンバー関数のクラス) が暗黙的に宣言されたかのように ...

于 2012-10-09T05:36:51.427 に答える
1

今日、これに出くわしました。「名前を省略する」回避策を使用しているだけですが、GCC に対して未解決の関連するバグが 2 つあります。

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 に答える