我只是偶然发现了一个我没想到的编译器错误:
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。