在标准N1570,Section 6.5.3.2#3
中,指定了以下内容(临时矿):
如果操作数是一元*运算符的结果,则两者都不是 运算符和&运算符都被求值,结果就像 除了对操作员的约束仍然适用之外,省略了 和 结果不是左值 。
6.5.3.2#4
部分的后面指定:
如果操作数指向一个函数,则结果为一个函数 代号;如果它指向一个对象,则 结果为左值 指定对象 。
这两个部分与我看起来矛盾。我引用的第一个参数指定result is not an lvalue
,但是第二个参数指定间接运算符的结果是一个左值。
您能解释一下吗?这是否意味着在使用对象的情况下,运算符*
和&
不会互相抵消吗?
答案 0 :(得分:4)
第6.5.3.2#3节讨论一元&
运算符,而6.5.3.2#4节讨论一元*
运算符。他们有不同的行为。
详细说明(from comment):
要点是,一元&
不会导致左值,即使在将其忽略的情况下也是如此,因为在取消引用上下文中一元*
紧接在一元&
之前。只是因为两个运算符都被忽略了,但这并不会改变结果表达式不是左值的事实。如果应用独身的int a;
&a = ...;
则不会如此。
int a;
&*a = ...;
(显然)是非法的。
&*
仅仅因为它们被忽略了并不意味着a
等于左using System.Net;
string content = "";
using (WebClient client = new WebClient ()) // WebClient class inherits IDisposable
{
content = client.DownloadString("http://yoursite.com/content.txt");
}
的左值。