Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;当一个数字文字是参数时,最麻烦的解析是什么?_C++_Ambiguous_Most Vexing Parse - Fatal编程技术网

C++ C++;当一个数字文字是参数时,最麻烦的解析是什么?

C++ C++;当一个数字文字是参数时,最麻烦的解析是什么?,c++,ambiguous,most-vexing-parse,C++,Ambiguous,Most Vexing Parse,我在做一个类似这样的课程: struct InputHandler { std::vector<std::pair<int, int>> keyBindings( 256 ); }; struct-InputHandler { std::向量键绑定(256); }; 它出现了一个错误,我知道这是因为编译器将其解释为函数而不是构造函数参数。但我想知道,当我在括号中传递一个数字时,是否有任何模棱两可的地方,比如在本例中?我知道我可以通过在这里使用花括号来解决这个问

我在做一个类似这样的课程:

struct InputHandler
{
    std::vector<std::pair<int, int>> keyBindings( 256 );
};
struct-InputHandler
{
std::向量键绑定(256);
};
它出现了一个错误,我知道这是因为编译器将其解释为函数而不是构造函数参数。但我想知道,当我在括号中传递一个数字时,是否有任何模棱两可的地方,比如在本例中?我知道我可以通过在这里使用花括号来解决这个问题,但我认为最麻烦的解析问题不会出现,因为使用256的数字文字不能解释为函数

编辑:我很高兴关闭或删除此问题。我学到的是,尽管这一行没有歧义,但C++11的一般规则禁止类内使用除=或{}以外的任何其他初始化器,这是一条一般规则,以免对该规则有额外的例外。另一方面,在main()函数中创建向量,如下所示:

std::vector<std::pair<int, int> foo(5);
std::vector 但我想知道,当我在括号中传递一个数字时,是否有任何模棱两可的地方,比如在本例中

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

为括号添加另一个重载用法从来都不是目标。在我看来,它被过度使用了。如果它在一般情况下不受支持,那么仅为您心目中的这个特定用例支持它几乎不是一个值得修改语法的有用特性

但我想知道,当我在括号中传递一个数字时,是否有任何模棱两可的地方,比如在本例中

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

为括号添加另一个重载用法从来都不是目标。在我看来,它被过度使用了。如果它在一般情况下不受支持,那么仅为您心目中的这个特定用例支持它几乎不是一个值得修改语法的有用特性

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

这是正确的,它不是最烦人的解析。最烦人的解析在以下方面正式处理:

由于函数样式转换和[stmt.ambig]中提到的声明之间的相似性而产生的歧义也可能发生在声明的上下文中。 在这种情况下,可以选择在参数名周围有一组冗余括号的函数声明和将函数样式转换为初始值设定项的对象声明之间进行选择。 至于[STMT.AMBIG]中提到的含糊之处,该决议是考虑任何可能是声明的构造。 这里的问题是,您不能使用
()
初始化成员,只能使用
=
{}
初始化成员,因此歧义解决方案自然不适用

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

这是正确的,它不是最烦人的解析。最烦人的解析在以下方面正式处理:

由于函数样式转换和[stmt.ambig]中提到的声明之间的相似性而产生的歧义也可能发生在声明的上下文中。 在这种情况下,可以选择在参数名周围有一组冗余括号的函数声明和将函数样式转换为初始值设定项的对象声明之间进行选择。 至于[STMT.AMBIG]中提到的含糊之处,该决议是考虑任何可能是声明的构造。
这里的问题是,您不能使用
()
初始化成员,只能使用
=
{}
初始化成员,因此歧义解决方案自然不适用

“编译器”不会将其解释为函数声明。这是不允许的语法。重复的问题说,这是因为它是一个歧义,在我的情况下,它不是歧义,这就是为什么我问为什么它不会被接受。我试图删除我的问题,但它不让我,说人们已经投入时间来回答它,所以我只接受答案。看起来它并不含糊,但规则是一致的,这样就不会在规则中添加另一个异常。@斑马鱼是的,这些规则的存在是为了避免含糊不清的可能性,即不复制最令人烦恼的解析失败。“编译器”不会将其解释为函数声明。这是不允许的语法。重复的问题说,这是因为它是一个歧义,在我的情况下,它不是歧义,这就是为什么我问为什么它不会被接受。我试图删除我的问题,但它不让我,说人们已经投入时间来回答它,所以我只接受答案。似乎没有歧义,但规则是一致的,这样就不会在规则中添加另一个例外。@Zebrafish是的,规则的存在是为了避免歧义的可能性,也就是说,不复制最令人烦恼的解析失败。我希望你不介意我接受另一个答案,而不是你的答案。这个答案强调,这只是类内初始值设定项的情况,并且这些初始值设定项只接受=或{}。我在我的主课上做了同样的测试,它通过调用讲师而不是禁止()初始化来编译,所以它看起来是正确的。谢谢。@Zebrafish小心
std::vector键绑定{256}虽然!这是你必须思考的新事物