C ++当一个数字文字是参数时,最烦人的解析?

时间:2018-01-01 08:19:18

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

我正在制作一个看起来像这样的课程:

struct InputHandler
{
    std::vector<std::pair<int, int>> keyBindings( 256 );
};

它出现了错误,我知道这是因为编译器将其解释为函数而不是构造函数参数。但是我想知道当我在括号中传递一个数字时,有什么不明确的,比如在这种情况下?我知道我可以通过在这里使用大括号来解决这个问题,但我认为最难以解决的解析问题不会出现,因为使用256的数字不能被解释为函数。

编辑:我很高兴关闭或删除此问题。我学到的东西是,即使这个特定的行不含糊,C ++ 11的一般规则禁止使用除=或{}以外的任何类型的初始化,这是一般规则,以免该规则有一个额外的例外。另一方面,在main()函数中创建向量:

std::vector<std::pair<int, int> foo(5);

工作正常。显然,这不是一个含糊不清的表达。

2 个答案:

答案 0 :(得分:4)

  

但我认为最难以解决的解析问题不会出现,因为使用256的数字不能被解释为函数。

这是正确的,它不是最令人烦恼的解析。最令人烦恼的解析在[dcl.ambig.res]正式处理:

  

函数式转换与[stmt.ambig]中提到的声明之间的相似性引起的歧义也可能出现在声明的上下文中。   在该上下文中,选择在函数声明与参数名称周围的冗余括号集和具有函数样式转换作为初始化器的对象声明之间。   正如[stmt.ambig]中提到的含糊不清一样,解决方案是考虑任何可能是声明声明的构造。

此处的问题是,您无法使用()初始化成员,只能使用={},因此歧义解决方案自然不适用。

答案 1 :(得分:2)

  

但是当我在括号中传递一个数字文字时,我想知道有什么不明确的吗?

可能不是,但它会使语法更复杂。默认成员初始化程序只支持统一初始化和复制初始化,因为这些东西不能出现在现有代码中。将它们与功能声明区分开来很容易。

为括号添加另一个重载用法从来都不是目标。它被过度使用,IMO。如果它一般不受支持,那么仅仅针对这个特殊用例支持它就不是一个值得语法扭曲的有用功能。