C++ 当数字文字是参数时,最令人烦恼的解析?
C++ Most vexing parse when a number literal is the argument?
我正在制作一个看起来像这样的类:
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。如果它通常不受支持,那么仅针对您想到的这个特定用例支持它几乎不是一个值得语法扭曲的有用功能。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 将数字打印成文字
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- C++ 当数字文字是参数时,最令人烦恼的解析?