【问题标题】:Why vexing parse in an if condition? [duplicate]为什么在 if 条件下麻烦解析? [复制]
【发布时间】:2016-02-15 13:52:52
【问题描述】:

考虑代码:

#include <iostream>

struct Foo
{
    Foo(int){}
    operator bool() const
    {
        return true;
    }
};

int main()
{
    if(Foo foo{42})
    {
        std::cout << "ok\n";
    }
}

它在 gcc5 下编译得很好。但是,如果我用

替换行 if(Foo foo{42})
if(Foo foo(42))

我得到一个编译时错误:

错误:“foo”之前的预期主表达式

这里发生了什么?没有麻烦的解析 imo,为什么使用大括号有效?

【问题讨论】:

  • @Niall 是的,这就是我问这个问题的原因,在那个答案出现之前。我现在应该把它作为一个骗子关闭它并链接到那个问题。
  • 我认为一个更广泛的问题是为什么一开始就不包括在内。这可能是一些兼容性问题,也不确定它如何与令人烦恼的解析相关联;但令我有些意外的是不被允许。去显示我在条件语句中初始化变量的次数是多么少......

标签: c++ c++11 most-vexing-parse


【解决方案1】:

条件的语法不包括经典的构造函数调用。

C++11 §6.4/1:

条件:
表达式
attribute-specifier-seqopt decl-specifier-seq 声明符 = initializer-clause
attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list

这用于ifswitchwhiledo。我很惊讶现在发现它在switch 中使用。我从没想过这是一个条件。

【讨论】:

  • 对于 C++11,这看起来像一个小缺陷 imo。为什么我们可以使用Foo foo{42} 而不是Foo foo(42)?这里没有解析问题。
  • 也许是为了简化解析?在条件中声明变量已经是一种特殊情况,括号已经足够重载了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
相关资源
最近更新 更多