【问题标题】:"error: expected expression" when using extra parentheses使用额外括号时的“错误:预期表达式”
【发布时间】: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 和 autodecltype 之类的东西,我有时会忘记可能会出现这种情况。编译器可能有办法看到(T)(exp)(T) 不同,并以不同的方式处理事情,但事实并非如此。这就是我想更好地理解的内容。
  • @BenC 您是否也希望能够声明(int) i = 0;

标签: c++ syntax compiler-errors parentheses


【解决方案1】:

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

【讨论】:

  • 确实,这个sizeof 实际上是我偶然发现的(重构一些代码时括号错误),这就是为什么我决定用不同的例子进行测试。编译器可以做一些令人惊奇的事情(例如最新的 C++11 功能),但在这里仍然失败。我了解这里发生了什么(这也是我的问题),我只是不明白是什么导致了这种情况((T) 在这种情况下只能是类型转换)。另外,我没有投反对票。
  • @BenC 它只能是一种类型转换,因为这是语法 (T) 有意义的唯一上下文。正如我所提到的,类型本身并不是一个表达式。因此,您不能指望T(T) 相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
相关资源
最近更新 更多