我偶然发现了一个我没想到的编译器错误:
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)
不能被视为{{1}}。我认为编译器能够看透(并且可能会返回警告),所以我认为这意味着存在不明确的情况,允许那些额外的括号会导致错误。
我的问题是:什么时候会有危险?这是C ++标准吗?
这是用clang 3.3测试的。和g ++ 4.7.2。
答案 0 :(得分:4)
sizeof
要求值(表达式)或类型。 (int)
不是其中之一 - 您不能将类型视为值并期望它们在您期望值这样做的情况下正确操作,因为它们不是(一等)值。因此,您不能只是将类型括起来并且具有相同的类型。