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

C++ Most vexing parse when a number literal is the argument?

本文关键字:烦恼 数字 文字 参数 C++      更新时间:2023-10-16

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

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

它提出了一个错误,我知道这是因为编译器将其解释为函数而不是构造函数参数。但是我想知道当我在括号中传递数字文字时,例如在这种情况下,是否有任何歧义?我知道我可以在这里只使用大括号来解决这个问题,但我认为不会出现最令人烦恼的解析问题,因为使用 256 的数字文字无法解释为函数。

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

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

工作正常。显然,这不是一个模棱两可的表达。

但我认为不会出现最烦人的解析问题,因为使用 256 的数字文字无法解释为函数。

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

由于函数样式强制转换和 [stmt.ambig] 中提到的声明之间的相似性而产生的歧义也可能发生在声明的上下文中。 在该上下文中,选择在参数名称周围带有一组冗余括号的函数声明和将函数样式强制转换为初始值设定项的对象声明之间进行选择。 至于[stmt.ambig]中提到的模棱两可之处,决议是将任何可能成为宣言的结构视为宣言。

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

但我

想知道当我在括号中传递数字文字时,例如在这种情况下,是否有任何歧义?

可能不是,但它会使语法更加复杂。默认成员初始值设定项仅支持统一初始化和复制初始化,因为这些内容不会出现在现有代码中。将它们与函数声明区分开来很容易。

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