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

问题描述 投票:0回答:2

这个问题在这里已有答案:

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

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

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

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

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

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

c++ ambiguous most-vexing-parse
2个回答
4
投票

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

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

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

这里的问题是你不能使用()初始化成员,只能使用={},所以自然歧义解析不适用。


2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.