给定C++函数f(X x),其中x是类型X的变量,类型Y的变量y,C++编译器将对y执行的所有自动/隐式转换是什么,以便语句"f(y) ;" 是合法代码(没有错误,没有警告)?
例如:
传递派生和功能获取基础& - 确定传递基础&功能派生& - 没有投射传递不能正常功能需要长时间 - 确定,创建一个临时长传递int和函数需要很长时间& - 不行,参考临时
注意内置类型与类相比如何有一些怪癖:一个Derived可以传递给函数接受一个Base(虽然它被切片),并且一个int可以传递给函数花费很长时间,但你不能传递一个int&to一个功能需要很长时间!!
什么是总是"正常"的完整案例列表(不需要使用任何演员来做)?
它是什么:我有一个C++脚本绑定库,它允许您绑定C++代码,它将在运行时基于脚本表达式调用C++函数.由于表达式是在运行时计算的,因此必须提前预期可能需要在表达式中使用的源类型和函数参数类型的所有合法组合,并在库中进行预编译,以便它们在运行时可用.如果我错过了一个合法的组合,一些合理的表达式将不适用于运行时表达式; 如果我意外地生成一个不合法的C++组合,我的库就不会编译.
编辑(缩小问题):
谢谢,你的所有答案实际上都非常有用.我知道答案很复杂,但听起来我只是看到了冰山一角.
让我稍微改一下这个问题然后限制它的范围:我将让用户指定一个"BaseClasses"列表和一个"UserDefinedConversions"列表.对于Bases,我将生成包括引用和指针转换在内的所有内容.但是我可以从UserDefined Conversions列表安全地做什么情况(const/reference/pointer)?(用户将提供裸类型,我将在模板中使用*,&,const等进行装饰.)
不幸的是,你的问题的答案非常复杂,在 ISO C++ 标准中至少占据了 9 页(具体来说:“3 标准转换”中的 ~6 页和“13.3.3.1 隐式转换序列”中的 ~3 页)。
简要总结:不需要强制转换的转换称为“隐式转换序列”。C++ 有“标准转换”,即基本类型(例如char提升为int)和数组到指针衰减等之间的转换;可以有几个连续的,因此称为“序列”。C++ 还允许用户定义的转换,这些转换由转换函数和转换构造函数定义。需要注意的重要一点是,隐式转换序列最多可以有一个用户定义的转换,并且可以选择在任一侧有一系列标准转换 - C++ 永远不会在没有强制转换的情况下将多个用户定义的转换“链接”在一起。
(如果有人想用完整的细节充实这篇文章,请继续......但对我来说,这太累了,抱歉:-/)