Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+;中相同的类成员名称和函数参数名称+;_C++_Arguments_Naming_Members - Fatal编程技术网

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
的解析方式是不同的,即使这完全有意义。