C++ C+;中相同的类成员名称和函数参数名称+;
我有一个简单的对象,它保存一些[公共]数据 我想保持我的接口干净,所以我不想对公共可访问变量的名称或函数参数的名称进行任何预/后修复 也就是说,我最终做了这样的事情:C++ C+;中相同的类成员名称和函数参数名称+;,c++,arguments,naming,members,C++,Arguments,Naming,Members,我有一个简单的对象,它保存一些[公共]数据 我想保持我的接口干净,所以我不想对公共可访问变量的名称或函数参数的名称进行任何预/后修复 也就是说,我最终做了这样的事情: 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? {/*
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.
};
模板结构Foo
{
显式Foo(tx):x(x)//这个[即,x(x)]似乎做了“正确的事情”,但是这个定义好吗?
{/* ^
无前/后固定。
*/
}
T x;//没有前/后固定。
};
我只是想重申:我所要问的是,这是否是定义明确的行为。不管我是否应该这样做
谢谢。是的,很好,非常标准 在名称查找中,局部变量总是排在第一位,但初始化列表中的
x(…)
显然只能引用成员变量[编辑:或基类]
如果未使用初始化列表,则必须编写:
explicit Foo(T x)
{
this->x = x;
}
特别是对于ctor的初始值设定项列表,它是定义良好的行为——因为您只能初始化一个成员或基类,所以其中一个与参数名称之间没有歧义
然而,在几乎任何其他情况下,都会产生歧义。特别是,您的标题只是指“函数”——对于除ctor之外的任何函数,这都不起作用。即使在ctor的主体内,它也不会起作用——“特殊”处理完全在ctor的初始值设定项列表中。一天前也有人问过同样的问题;对不起,我没有链接。答案似乎是肯定的,它定义得很好。谢谢,我想我在搜索中错过了它。那么,我接受波塔的回答。我不会因为你要问这个问题就用它。事实上,它是不容易阅读的,这意味着维护人员将在一年内出现,并说“干草不看写”,要么修复它,要么花一个dat来确保它工作。simpel规则不会编写要求您就其是否有效提出问题的代码。谢谢,我知道这种模糊性以及“this->”访问的必要性。经过深思熟虑,我想我应该想出一个更好的标题呜呜。那不一样。这里是默认构造,然后使用赋值运算符。这显然是不理想的,尤其是T并不简单。从实际执行的角度来看,情况并不相同,但这是如何执行名称查找的一个很好的例子:在构造函数体中,局部变量隐藏了成员,因此成员必须是完全限定的,而在初始化列表中,初始化的(缺少更好的名称)名称必须是当前类的子对象,并且不需要明确的名称。我一直发现,在
x(x)
中,第一个和第二个x
的解析方式是不同的,即使这完全有意义。