【问题标题】:Is this a bug in clang++/g++? [duplicate]这是 clang++/g++ 中的错误吗? [复制]
【发布时间】:2018-05-31 16:24:02
【问题描述】:

给定:

void function(int*=0) {}
int main() {
}

叮当声(3.8.0):

test.cc:1:18: error: expected ')'
void function(int*=0) {
                 ^

g++ (5.4.0):

test.cc:1:18: error: expected ‘,’ or ‘...’ before ‘*=’ token
 void function(int*=0) {
                  ^    

如果我把它改成(注意间距):

void function(int* = 0) {}
int main() {
}

很明显,我输入的是 T* = 0 还是 T *= 0,这让我感到困惑,这是错误还是预期?

【问题讨论】:

标签: c++


【解决方案1】:

*= 是一个运算符,就像+= 一样。所以x *= 2;x = x * 2;是一样的

您希望 * = 被用作两个标记(从概念上讲,在 C++ 中,lexing 发生在之前,并且几乎独立于 parsing;了解 C++ translation phases)。

【讨论】:

  • 但是 *= 在这种情况下完全没有意义,为什么编译器会假设它是乘法运算符?
  • 因为词法分析和解析在概念上是独立的阶段
  • @bartop 见my comment above wrt to max munch。
  • @bartop "但 *= 在这种情况下完全没有意义" 是的 - 它没有意义,因此编译器抱怨它的原因。 Tokenizer 不关心上下文,它只关心令牌,*= 被作为单个令牌进行词法分析。
【解决方案2】:

有一种简单的方法可以乘以一个值,例如:

foo *= 2;

基本上与以下内容相同:

foo = foo * 2;

也许这就是它的困惑。

【讨论】:

  • 这不是正在发生的事情......
  • 启发我们:)
  • 没关系——我想我现在明白你的意思了。一开始我没有,抱歉:-P
猜你喜欢
  • 1970-01-01
  • 2020-06-17
  • 2012-07-25
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
  • 2019-08-09
相关资源
最近更新 更多