【发布时间】:2013-06-20 12:52:43
【问题描述】:
我只是偶然发现了一个我没想到的编译器错误:
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。
【问题讨论】:
-
好吧,它正在寻找一些可以转换的价值,当没有价值时它会抱怨。为什么这令人惊讶?
-
@legion:问题不在于错误本身,而在于导致这种情况的原因。使用 C++11 和
auto或decltype之类的东西,我有时会忘记可能会出现这种情况。编译器可能有办法看到(T)(exp)与(T)不同,并以不同的方式处理事情,但事实并非如此。这就是我想更好地理解的内容。 -
@BenC 您是否也希望能够声明
(int) i = 0;?
标签: c++ syntax compiler-errors parentheses