我有一个包含一些[公共]数据的简单对象。
我希望保持我的界面干净,所以我不想在公共可访问变量的名称和函数参数的名称之前/后修复任何内容。
那就是说,我最终做了这样的事情:
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.
};
重申一下:我所要问的是这是否是明确定义的行为。不是我应该或不应该这样做......
感谢。
答案 0 :(得分:7)
是的,那很好,而且非常标准。
局部变量总是在名称查找中排在第一位,但初始化列表中的x(...)
显然只能引用成员变量[edit:或基类]。
如果您没有使用初始化列表,则必须写:
explicit Foo(T x)
{
this->x = x;
}
答案 1 :(得分:1)
特别是对于ctor的初始化列表,它是明确定义的行为 - 因为你只能初始化一个成员或基类,其中一个和参数的名称之间没有歧义。
然而,在几乎任何其他情况下,你都会产生歧义。特别是,你的标题只是指“功能” - 对于除了ctor之外的任何功能,这都行不通。即使在ctor体内,它也行不通 - “特殊”处理纯粹属于ctor的初始化列表。