C++ &引用;错误:应为表达式“0”;使用附加括号时

C++ &引用;错误:应为表达式“0”;使用附加括号时,c++,syntax,compiler-errors,parentheses,C++,Syntax,Compiler Errors,Parentheses,我刚刚偶然发现了一个我没有预料到的编译器错误: std::难道这会导致“错误:预期表达式” 显然,编译器将(T)解释为显式转换,并在那里停止。我理解错误,我理解编译器的期望,我不明白的是为什么(T)不能被视为T,如果它不在(T)(exp)的上下文中。我认为编译器能够看穿这一点(并可能返回警告),因此我认为这意味着在一些不明确的情况下,允许这些额外的括号将导致错误 我的问题是:什么时候会很危险?这是C++标准中的吗?< /P> 这是用Clang3.3测试的。和g++4.7.2。sizeof需要值

我刚刚偶然发现了一个我没有预料到的编译器错误:

std::难道这会导致“错误:预期表达式”
显然,编译器将
(T)
解释为显式转换,并在那里停止。我理解错误,我理解编译器的期望,我不明白的是为什么
(T)
不能被视为
T
,如果它不在
(T)(exp)
的上下文中。我认为编译器能够看穿这一点(并可能返回警告),因此我认为这意味着在一些不明确的情况下,允许这些额外的括号将导致错误

我的问题是:什么时候会很危险?这是C++标准中的吗?< /P>
这是用Clang3.3测试的。和g++4.7.2。

sizeof
需要值(表达式)或类型
(int)
不是其中之一-您不能将类型视为值,并期望它们在您期望值的情况下正确操作,因为它们不是(一级)值。因此,您不能只是将一个类型插入括号,然后将相同的类型显示出来。

好吧,它是在寻找要转换的值,当没有值时,它会抱怨。为什么会这样令人惊讶?@legion:问题不在于错误本身,而是导致这种情况的原因。使用C++11和类似于
auto
decltype
的东西,我有时会忘记这种情况可能会出现。编译器可能有办法看到
(T)(exp)
(T)
不同,并以不同的方式处理问题,但事实并非如此。这就是我想更好地理解的。@BenC您是否希望能够声明
(int)I=0?事实上,这个
sizeof
实际上就是我偶然发现的(在重构一些代码时错误地插入括号),这就是为什么我决定用另一个示例进行测试。编译器可以做一些惊人的事情(例如,最新的C++11特性),但在这里仍然失败。我理解这里发生了什么(这也是我的问题),我只是不明白是什么导致了这种情况(
(t)
在这种情况下只能是类型转换)。另外,我没有投反对票。@BenC它只能是一个类型转换,因为这是语法
(T)
有意义的唯一上下文。正如我提到的,类型本身不是表达式。因此,您不能期望
t
(t)
相同。