[expr.static.cast]/4(重点是我的):
表达式e可以显式地转换为类型T,如果存在从e到T的隐式转换序列([over.best.ics]),或者如果针对来自e的类型T的对象或引用的直接初始化([dcl.init])的重载解析将找到至少一个可行函数([over.match. vival]),则表达式e可以显式地转换为类型T。如果T是引用类型,则效果与执行声明和初始化相同
T t(e);
对于某个发明的临时变量t([dcl.init]),然后使用临时变量作为转换的结果。否则,结果对象直接从e初始化。[注意:当试图将类类型的表达式转换为不可访问或不明确的基类时,转换是病态的。- 尾注]
在T
类型的对象的重载解析的情况下,术语一个可行函数指的是类T
的构造函数还是类中的转换函数,其中e
是对象。
1条答案
按热度按时间46scxncf1#
[dcl.init.general]/16告诉您为了执行直接初始化而要执行的重载解析。
static_cast
的操作数不能是一个 * 花括号初始化列表 *,我将跳过T
是一个数组的特殊情况,因为Clang和GCC似乎从来不允许它。所以p16.6将控制
T
是一个类的情况。除了源表达式是一个完全匹配类型的纯右值的特殊情况(除了cv-qualification),重载解析被跳过,我们从p16.6.2中看到重载解析将在T
的构造函数中完成。因此,如果找到T
的至少一个可行构造函数,则认为可以执行static_cast
(尽管它可能是病态的,例如因为重载解析可能无法选择最佳可行函数,或者最佳可行函数可能不可访问)。如果e
具有可以转换为T
的转换函数,则这些转换函数可能参与帮助使T
的复制构造函数或移动构造函数可行。如果
T
不是类,但e
是类类型,则由p16.7控制,重载解析在e
的转换函数中执行。因此,如果至少一个转换函数是可行的,则认为可以执行static_cast
(同样,它可能仍然是病态的)。因此,对于你的问题“一个可行的函数”是指构造函数还是转换函数的答案是:这取决于[dcl.init.general]/16的哪种情况应用于初始化。
我还没有谈到引用的情况。关于这一点,请参见[dcl.init.ref]。