使用额外括号时"错误:预期表达式"

Ben*_*enC 6 c++ syntax compiler-errors parentheses

我偶然发现了一个我没想到的编译器错误:

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

同样,我们有:

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

显然,编译器将其解释(T)为显式转换并停在那里.我理解错误,我理解编译器期待的是什么,我没有得到的是为什么(T)不能将T它视为不在上下文中(T)(exp).我认为编译器能够看透(并且可能会返回警告),所以我认为这意味着存在不明确的情况,允许那些额外的括号会导致错误.

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

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

小智 4

sizeof需要一个(表达式)或类型。(int)不是它们中的任何一个 - 您不能将类型视为值并期望它们在您期望值这样做的情况下正确运行,因为它们不是(一流)值。因此,您不能只将类型括起来并得到相同的类型。