[expr.static.cast]/4 中的术语“一个可行的功能”指的是什么?

问题描述 投票:0回答:1

[expr.static.cast]/4(重点是我的):

如果存在从 e 到 T 的隐式转换序列([over.best.ics]),或者如果 直接初始化 ([dcl.init]) 的重载决议 来自 e 的类型 T 的对象或引用将至少找到 one 可行的 功能([over.match.viable])。如果 T 是引用类型,则效果 与执行声明和初始化相同

T t(e);

对于一些发明的临时变量 t ([dcl.init]) 然后使用 作为转换结果的临时变量。否则, 结果对象是从 e 直接初始化的。 [注意:转换是 尝试将类类型的表达式转换为时格式错误 不可访问或不明确的基类。 ——尾注]

在类型

T
的对象的重载决议的情况下,术语one viable function是指类
T
的构造函数还是类中的转换函数,其中
e
是一个目的。

c++ initialization language-lawyer c++17
1个回答
0
投票

[dcl.init.general]/16 告诉你为了执行直接初始化要做什么重载决议。

static_cast
的操作数不能是 braced-init-list 我将跳过
T
是数组的特殊情况,因为 Clang 和 GCC 似乎永远不允许它。

所以 p16.6 将管理

T
是一个类的情况。除了源表达式是完全匹配类型的纯右值(cv 限定除外)的特殊情况,重载决策被跳过,我们从 p16.6.2 看到重载决策将在
T
的构造函数中完成.因此,如果至少找到一个
T
的可行构造函数,则认为
static_cast
可以执行(尽管它可能格式错误,例如因为重载解析可能无法选择最佳可行函数,或者最好的可行功能可能无法访问)。如果
e
具有可以转换为
T
的转换函数,这些转换函数可能会参与帮助使
T
的复制构造函数或移动构造函数可行。

如果

T
不是类,而
e
是类类型,则p16.7支配,在
e
的转换函数之间进行重载解析。因此,如果至少一个转换函数是可行的,则认为
static_cast
可以执行(同样,它可能仍然是病式的)。

因此,对于“一个可行函数”是指构造函数还是转换函数的问题,答案是:这取决于 [dcl.init.general]/16 的哪种情况适用于初始化。

我还没有涉及引用的情况。为此,请参阅 [dcl.init.ref]。

© www.soinside.com 2019 - 2024. All rights reserved.