使用额外括号时的"error: expected expression"

"error: expected expression" when using extra parentheses

本文关键字:error expected expression      更新时间:2023-10-16

我刚刚无意中发现了一个编译器错误:

std::cout << sizeof(int)   << std::endl;  // ---> this is valid (obviously)
std::cout << sizeof((int)) << std::endl;  // ---> this leads to
                                          // "error: expected expression"

同样,我们有:

template <typename T>
struct Foo
{
    T value;
};
Foo<int>   f1;  // ---> this is valid (obviously)
Foo<(int)> f2;  // ---> this leads to "error: expected expression"

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

我的问题是:什么时候会有危险?这在C++标准中吗?

这是用clang 3.3测试的。和g++4.7.2。

sizeof需要(表达式)或类型。(int)既不是其中之一,也不能将类型视为值,并期望它们在期望值这样做的情况下正确操作,因为它们不是(一流)值。因此,你不能只在一个类型中加上括号,然后出现相同的类型。

相关文章: