6

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

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不在(T)(exp). 我认为编译器能够看穿它(并且可能返回警告),所以我想这意味着存在模棱两可的情况,允许这些额外的括号会导致错误。

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

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

4

1 回答 1

4

sizeof需要一个(一个表达式)或一个类型。(int)两者都不是 - 您不能将类型视为值并期望它们在您期望值这样做的情况下正确运行,因为它们不是(一等)值。因此,你不能只给一个类型加上括号,然后输出相同的类型。

于 2013-06-24T05:03:47.003 回答