3

[公開]データを保持する単純なオブジェクトがあります。

インターフェイスをクリーンに保ちたいので、公的にアクセス可能な変数の名前や関数の引数の名前に事前/後修正を加えたくありません。

そうは言っても、私は次のようなことをすることになりました。

template<typename T> struct Foo
{
  explicit Foo(T x) : x(x) // This [i.e., x(x)] seems to be doing the "Right Thing", but is this well defined?
  {/*            ^ 
       No pre-/post- fixing.
   */
  }

  T x; // No pre-/post- fixing.
};

繰り返しになりますが、私が求めているのは、これが明確に定義された動作であるかどうかだけです。私がこれをするべきかどうかではありません...

ありがとう。

4

2 に答える 2

7

はい、それで問題ありません。完全に標準です。

ローカル変数は常に名前検索で最初に来ますがx(...)、初期化リストの は明らかにメンバー変数 [編集:または基底クラス] しか参照できません。

初期化リストを使用しなかった場合は、次のように記述する必要があります。

explicit Foo(T x)
{
    this->x = x;
}
于 2010-02-02T03:45:32.983 に答える
1

具体的には、ctor の初期化子リストの場合、これは明確に定義された動作です。メンバーまたは基本クラスのみを初期化できるため、それらの 1 つとパラメーターの名前の間にあいまいさはありません。

ただし、他のほとんどの状況では、あいまいさが生じます。特に、あなたのタイトルは単に「関数」を指しています.ctor以外の関数では、これは機能しませんctor の本体内であっても機能しません。「特別な」処理は純粋に ctor の初期化子リスト内にあります。

于 2010-02-02T03:49:04.617 に答える