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 的初始化器列表,它是定义明确的行为——因为您只能初始化一个成员或基类,所以其中之一与参数名称之间没有歧义。

然而,在几乎任何其他情况下,您都会产生歧义。特别是,您的标题仅指“功能”-对于除ctor以外的任何功能,这都行不通。即使在 ctor 的主体内部,它也不起作用——“特殊”处理纯粹是在 ctor 的初始化列表中。

于 2010-02-02T03:49:04.617 回答